使用 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
列。
然后从这个展开的列中选择column1
和column2
。
像这样
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 中实现结果
如何使用pyspark将具有多个可能值的Json数组列表转换为数据框中的列
如何将 pandas 数据框转换为 json 以在 django 模板中使用