无法使用 sparkDataframe 获取 Json 列:org.apache.spark.sql.AnalysisException:无法解析 'explode;

Posted

技术标签:

【中文标题】无法使用 sparkDataframe 获取 Json 列:org.apache.spark.sql.AnalysisException:无法解析 \'explode;【英文标题】:Unable to fetch Json Column using sparkDataframe:org.apache.spark.sql.AnalysisException: cannot resolve 'explode;无法使用 sparkDataframe 获取 Json 列:org.apache.spark.sql.AnalysisException:无法解析 'explode; 【发布时间】:2020-07-10 19:30:22 【问题描述】:

有人可以在这种情况下帮助我吗?我正在使用 spark/scala 读取一个 Json 文件,然后尝试访问列名,但在访问列名时我收到以下错误消息。

     org.apache.spark.sql.AnalysisException: cannot resolve 
    'explode(`b2b_bill_products_prod_details`.`amt`)' 
    due to data type mismatch: input to function explode should be 
     array or map type, not DoubleType;;
     

请参阅下面的 Json Schema 和我的代码。

     root
     |-- b2b: array (nullable = true)
     |    |-- element: struct (containsNull = true)
     |    |    |-- add1: string (nullable = true)
     |    |    |-- bill: array (nullable = true)
     |    |    |    |-- element: struct (containsNull = true)
     |    |    |    |    |-- amt: double (nullable = true)
     |    |    |    |    |-- products: array (nullable = true)
     |    |    |    |    |    |-- element: struct (containsNull = true)
     |    |    |    |    |    |    |-- prod_details: struct (nullable = true)
     |    |    |    |    |    |    |    |-- amt: double (nullable = true)

我想访问 amt 字段(json 模式中的最后一行)我在 spark/scala 代码下方编写

    df.withColumn("b2b_bill",explode($"b2b.bill"))
    .withColumn("b2b_bill_products",explode($"b2b_bill.products"))
    .withColumn("b2b_bill_products_prod_details", explode($"b2b_bill_products.prod_details"))
    .withColumn("b2b_bill_products_prod_details_amt",explode($"b2b_bill_products_prod_details.amt"))

【问题讨论】:

如果您有更多列并且不想分解单个列,请查看这篇文章 - ***.com/questions/61863489/… .. 它将使所有嵌套的复杂列变平。 【参考方案1】:

您的第四个explode 函数应用于amt: double 列,其中explode 函数需要array/map 输入类型。这就是报告的错误。

编辑

您可以使用下面给出的表达式访问最里面的amt 字段,

df.withColumn("b2b_bill",explode($"b2b.bill"))
  .withColumn("b2b_bill_products",explode($"b2b_bill.products"))
  .withColumn("b2b_bill_products_prod_details_amt", $"b2b_bill_products.element.prod_details.amt")

【讨论】:

是的,我理解了这个问题。请建议我应该如何修改我的代码,以便我可以访问该 amt 列。 @RahulPatidar,我已经更新了答案,看看这是否对你有帮助。 非常感谢,是的,我可以获取列。

以上是关于无法使用 sparkDataframe 获取 Json 列:org.apache.spark.sql.AnalysisException:无法解析 'explode;的主要内容,如果未能解决你的问题,请参考以下文章

创建 Spark DataFrame。无法推断类型的架构:<type 'float'>

为啥我无法使用 Next.js 的 getInitialProps 获取我的 Metamask 帐户地址?

无法使用 Express.js 从请求中获取 POST 正文

无法使用react js获取表上的数据

sparkdataframe需要主动缓存吗

无法使用 discord.js 获取带有 giphy 的 gif,制作机器人