Массив JSON в кадр данных в pyspark

#python #apache-spark #pyspark

Вопрос:

У меня возникли некоторые проблемы с чтением элементов из файла Json, и возникли некоторые проблемы с выводом данных из него в столбцы.

 {
   "sample":[
      {
         "value":"Red",
         "id":"1"
      },
      {
         "value":"green",
         "id":"2"
      },
      {
         "value":"orange",
         "id":"3"
      }
   ],
   "scientific_names":"Buxus microphylla",
   "gender":"bushes",
   "examples":"Oleander"
}
 

Я хотел бы получить эти объекты JSON в фрейме данных, например

  ------------------ ------------------- -------- ---------- -- 
| sample           | scientific_names  | gender | examples |  |
 ------------------ ------------------- -------- ---------- -- 
| Red,green,orange | Buxus microphylla | bushes | Oleander |  |
 ------------------ ------------------- -------- ---------- -- 
|                  |                   |        |          |  |
 ------------------ ------------------- -------- ---------- -- 
|                  |                   |        |          |  |
 

Кто-нибудь может мне помочь, пожалуйста? Спасибо!

Ответ №1:

Вы можете просто передать правильную схему и выбрать value столбец

 # a.json
# {...} your full json sample

schema = T.StructType([
    T.StructField('sample', T.ArrayType(T.StructType([
        T.StructField('id', T.StringType()),
        T.StructField('value', T.StringType())
    ]))),
    T.StructField('scientific_names', T.StringType()),
    T.StructField('gender', T.StringType()),
    T.StructField('examples', T.StringType()),
])

(spark
    .read
    .json('a.json', schema=schema, multiLine=True)
    .withColumn('sample', F.col('sample.value'))
    .show(10, False)
)

# Output
#  -------------------- ----------------- ------ -------- 
# |sample              |scientific_names |gender|examples|
#  -------------------- ----------------- ------ -------- 
# |[Red, green, orange]|Buxus microphylla|bushes|Oleander|
#  -------------------- ----------------- ------ --------