Конвертируйте JSON, используя PySpark и фрейм данных, чтобы элементы массива находились под root - PullRequest
0 голосов
/ 19 сентября 2018

Я хочу реорганизовать следующий 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 ]

0 голосов
/ 20 сентября 2018

Вы можете взорвать столбец response.docs.
Затем просто выберите column1 и column2 из этого разнесенного столбца.
Как это

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

Тогда результат будет похож наэто

+-------+-------+
|column1|column2|
+-------+-------+
|  dataA|  dataB|
|  dataC|  dataD|
+-------+-------+
0 голосов
/ 20 сентября 2018

Попробуйте использовать Разнесите Функция Spark (см. Пример здесь )

...