Преобразование многоуровневого JSON в фрейм данных с помощью pyspark

Мой входной файл JSON

{
"Name": "Test",
"Mobile": 12345678,
"Boolean": true,
"Pets": ["Dog", "cat"],
"Address": {
  "Permanent address": "USA",
  "current Address": "AU"
  }
}

Требование состоит в том, чтобы преобразовать вышеупомянутый многоуровневый JSON в фрейм данных с помощью pyspark.

Я пытался использовать код

path_to_input = "/FileStore/tables/sample_json_file2-6c20f.json"
df = spark.read.json(sc.wholeTextFiles(path_to_input).values())
df.show()

Я получил вывод как

+---------+-------+--------+----+----------+
|  Address|Boolean|  Mobile|Name|      Pets|
+---------+-------+--------+----+----------+
|[USA, AU]|   true|12345678|Test|[Dog, cat]|
+---------+-------+--------+----+----------+

В полях адреса и домашних животных я получаю два значения в одних и тех же столбцах. Это не должно быть похоже на массив. Я должен получить адрес Address_Permanent как USA, Address_current Address как AU.


person Ravali    schedule 30.12.2019    source источник
comment
что ты уже испробовал? Можете ли вы опубликовать код ответа?   -  person LeandroHumb    schedule 30.12.2019
comment
Отвечает ли это на ваш вопрос? Pyspark — преобразование строки json в DataFrame   -  person blackbishop    schedule 30.12.2019
comment
Отвечает ли это на ваш вопрос? Разбор файла JSON в Pyspark   -  person Oliver W.    schedule 31.12.2019


Ответы (1)


Вы можете попробовать что-то вроде ниже:

schema_json = StructType([StructField("Address", StringType(), True),
                      StructField("Boolean", BooleanType(), True),
                      StructField("Mobile", LongType(), True),
                      StructField("Name", StringType(), True),
                      StructField("Pets", StringType(), True)])

df = spark.read.json(path="/FileStore/tables/sample_json_file2-6c20f.json", schema = schema_json)
df.show(truncate=False)

Это будет иметь вывод, как показано ниже:

+--------------------------------------------------+-------+--------+----+-------------+
|Address                                           |Boolean|Mobile  |Name|Pets         |
+--------------------------------------------------+-------+--------+----+-------------+
|{"Permanent address":"USA","current Address":"AU"}|true   |12345678|Test|["Dog","cat"]|
+--------------------------------------------------+-------+--------+----+-------------+

ИЗМЕНИТЬ

Если вы хотите Permanent address и current Address в отдельных столбцах, вы можете сделать, как показано ниже:

 from pyspark.sql.functions import get_json_object

 df = spark.read.json(path="/FileStore/tables/sample_json_file2-6c20f.json", schema=schema_json)\
        .select("Boolean","Mobile","Name","Pets",get_json_object('Address', "$.Permanent address").alias('Permanent address'),get_json_object('Address', "$.current Address").alias('current Address'))
 df.show(truncate=False)

Выход:

+-------+--------+----+-------------+-----------------+---------------+
|Boolean|Mobile  |Name|Pets         |Permanent address|current Address|
+-------+--------+----+-------------+-----------------+---------------+
|true   |12345678|Test|["Dog","cat"]|USA              |AU             |
+-------+--------+----+-------------+-----------------+---------------+
person Saurabh    schedule 31.12.2019
comment
Спасибо. Но мы должны получить Address_Permanent address и Address_current Address в виде отдельных столбцов. - person Ravali; 31.12.2019