使用 PySpark 和数据框转换 JSON 以在根目录下包含数组元素

Convert JSON using PySpark and data frame to have array elements under root

我想重组以下内容JSON,使docs下的数组元素在root下。

示例输入

{
  "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 完成此操作?

尝试使用 explode Spark function (see example )

您可以分解 response.docs 列。
然后只是这个展开的列中的 select column1column2
像这样

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

那么结果就是这样

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