使用 PySpark 和数据框转换 JSON 以在根下具有数组元素

Posted

技术标签:

【中文标题】使用 PySpark 和数据框转换 JSON 以在根下具有数组元素【英文标题】:Convert JSON using PySpark and data frame to have array elements under root 【发布时间】:2018-09-19 14:36:07 【问题描述】:

我想重新组织以下 JSON,以便 docs 下的数组元素位于根目录下。

示例输入


  "response":"docs":
      [
        "column1":"dataA",
        "column2":"dataB"
      ,  
      
        "column1":"dataC",
        "column2":"dataD"
      ]
   

示例 PySpark 脚本

from pyspark.sql import SQLContext
from pyspark import SparkContext, SparkConf


conf = SparkConf().setAppName("pyspark")
sc = SparkContext(conf=conf)

sqlContext = SQLContext(sc)
df = sqlContext.read.json("file:///.../input.json", multiLine=True)
new = df.select("response.docs")
new.printSchema()
new.write.mode("overwrite").format('json').save("file:///.../output.json")

脚本已经将架构转换为以下内容

root
 |-- docs: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- column1: string (nullable = true)
 |    |    |-- column2: string (nullable = true)

但是,它应该看起来像这个最终的 JSON

[
 "column1":"dataA","column2":"dataB",
 "column1":"dataC","column2":"dataD"
]

如何使用 Spark 做到这一点?

【问题讨论】:

【参考方案1】:

您可以分解response.docs 列。 然后从这个展开的列中选择column1column2。 像这样

df.select(F.explode('response.docs').alias('col')) \
  .select('col.column1', 'col.column2')

那么结果会是这样的

+-------+-------+
|column1|column2|
+-------+-------+
|  dataA|  dataB|
|  dataC|  dataD|
+-------+-------+

【讨论】:

【参考方案2】:

尝试使用explode Spark 函数(参见示例here)

【讨论】:

嗨。感谢你的回答。但是,似乎 df.select(explode(df.response.docs)) 也会创建一个名为“col”的新列。 之后只需要选择需要的列

以上是关于使用 PySpark 和数据框转换 JSON 以在根下具有数组元素的主要内容,如果未能解决你的问题,请参考以下文章

应用转换或连接条件以在 pyspark 或 hive 中实现结果

将嵌套的 Json 转换为 Pyspark 中的数据框

如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列

如何将 pandas 数据框转换为 json 以在 django 模板中使用

如何将 json 对象列表转换为单个 pyspark 数据框?

通过使用pyspark将列转换为行来解析数据框中的Json字符串列表?