Конвертируйте JSON, используя PySpark и фрейм данных, чтобы элементы массива находились под 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?
2 ответа
Вы можете взорвать response.docs
колонка.
Затем просто выберите column1
а также column2
из этой взорвавшейся колонны.
Как это
df.select(F.explode('response.docs').alias('col')) \
.select('col.column1', 'col.column2')
Тогда результат будет таким
+-------+-------+
|column1|column2|
+-------+-------+
| dataA| dataB|
| dataC| dataD|
+-------+-------+
Попробуйте использовать функцию разнесения Spark (см. Пример здесь)