如何在 Spark 中使用 from_json() 数据框?

Posted

技术标签:

【中文标题】如何在 Spark 中使用 from_json() 数据框?【英文标题】:How do I use a from_json() dataframe in Spark? 【发布时间】:2018-10-23 09:22:01 【问题描述】:

我正在尝试从 Databricks 3.5 (Spark 2.2.1) 中的数据框中的 json 字符串创建数据集。在“jsonSchema”下面的代码块中,是一个 StructType,它具有正确布局的 json-string,它位于数据框的“body”列中。

val newDF = oldDF.select(from_json($"body".cast("string"), jsonSchema))

这将返回根对象所在的数据框

jsontostructs(CAST(body AS STRING)):struct

后跟架构中的字段(看起来正确)。当我在 newDF 上尝试另一个选择时

val transform = newDF.select($"propertyNameInTheParsedJsonObject")

抛出异常

org.apache.spark.sql.AnalysisException: cannot resolve '`columnName`' given 
input columns: [jsontostructs(CAST(body AS STRING))];;

我显然错过了一些东西。我希望 from_json 会返回一个我可以进一步操作的数据框。

我的最终目标是将 oldDF 正文列中的 json 字符串转换为数据集。

【问题讨论】:

【参考方案1】:

from_json 返回 struct 或 (array<struct<...>>) 列。这意味着它是一个嵌套对象。如果您提供了一个有意义的名称:

val newDF = oldDF.select(from_json($"body".cast("string"), jsonSchema) as "parsed")

架构描述了一个普通的struct,您可以使用standard methods 之类的

newDF.select($"parsed.propertyNameInTheParsedJsonObject")

否则请按照访问数组的说明进行操作。

【讨论】:

谢谢,确实给返回的结构命名是关键。

以上是关于如何在 Spark 中使用 from_json() 数据框?的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL from_json 文档

Spark2 Kafka结构化流Java不知道from_json函数

Spark高级操作之json复杂和嵌套数据结构的操作一

如何在 Spark 中使用 Python 查找 DataFrame 中的分区数以及如何在 Spark 中使用 Python 在 DataFrame 中创建分区

如何在 Zeppelin 中切换 Spark 版本以使用 Spark 3.x

如何在 AWS Glue 中使用 Spark 包?