使用 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 column1
和 column2
。
像这样
df.select(F.explode('response.docs').alias('col')) \
.select('col.column1', 'col.column2')
那么结果就是这样
+-------+-------+
|column1|column2|
+-------+-------+
| dataA| dataB|
| dataC| dataD|
+-------+-------+
我想重组以下内容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 column1
和 column2
。
像这样
df.select(F.explode('response.docs').alias('col')) \
.select('col.column1', 'col.column2')
那么结果就是这样
+-------+-------+
|column1|column2|
+-------+-------+
| dataA| dataB|
| dataC| dataD|
+-------+-------+