Как преобразовать файл JSON в обычный фрейм данных таблицы в Apache Spark

#apache-spark #pyspark

Вопрос:

У меня есть следующие поля JSON

 {"constructorId":1,"constructorRef":"mclaren","name":"McLaren","nationality":"British","url":"http://en.wikipedia.org/wiki/McLaren"}

{"constructorId":2,"constructorRef":"bmw_sauber","name":"BMW Sauber","nationality":"German","url":"http://en.wikipedia.org/wiki/BMW_Sauber"}
 

Следующий код создает следующий фрейм данных:
Я запускаю код на базе данных

 df = (spark.read 
      .format(csv) 
      .schema(mySchema) 
      .load(dataPath)    
           )

  display(df)
 

введите описание изображения здесь

Однако мне нужно, чтобы фрейм данных выглядел следующим образом:

введите описание изображения здесь

Я считаю, что проблема в том, что JSON вложен, и я пытаюсь преобразовать его в CSV. Тем не менее, мне нужно конвертировать в CSV.

Есть ли код, который я могу применить для удаления вложенной функции JSON?

Комментарии:

1. Похоже, что вы можете читать json напрямую, spark.read.json(path) не используя csv.

2. @Lamanus, спасибо, что перезвонил мне. Я должен был упомянуть, что я читаю в наборе данных, который является файлом JSON. Поэтому мне нужно прочитать файл в формате JSON, а затем я конвертирую его в CSV. В принципе, мне нужно, чтобы набор данных был в формате CSV.

Ответ №1:

Просто попробуй:

 someDF = spark.read.json(somepath)
 

Выведите схему по умолчанию или предоставьте свою собственную, установите в вашем случае в многострочном PySpark значение false.

 someDF = spark.read.json(somepath, someschema, multiLine=False)
 

Видишь https://spark.apache.org/docs/latest/sql-data-sources-json.html

С выводом схемы:

 df = spark.read.option("multiline","false").json("/FileStore/tables/SOabc2.txt")
df.printSchema()
df.show()
df.count()
 

ВОЗВРАТ:

 root
 |-- constructorId: long (nullable = true)
 |-- constructorRef: string (nullable = true)
 |-- name: string (nullable = true)
 |-- nationality: string (nullable = true)
 |-- url: string (nullable = true)

 ------------- -------------- ---------- ----------- -------------------- 
|constructorId|constructorRef|      name|nationality|                 url|
 ------------- -------------- ---------- ----------- -------------------- 
|            1|       mclaren|   McLaren|    British|http://en.wikiped...|
|            2|    bmw_sauber|BMW Sauber|     German|http://en.wikiped...|
 ------------- -------------- ---------- ----------- -------------------- 

Out[11]: 2
 

Комментарии:

1. Привет, bluephantom, я попробовал ваше предложение следующим образом: df = (spark.read .format(csv) .schema(mySchema) .option("multiLine", True) .load(dataPath) ) Но я получил ту же таблицу

2. можете ли вы показать весь код, пожалуйста

3. Я скоро покажу весь код, но должен отметить, что JSON-это однострочный, а не многострочный. Имеет ли это какое-то значение?

4. Я упомянул, что JSON в примере был вложенным. Было ошибкой предполагать, что он вложен, так как он явно не вложен.

5. Я не нахожу проблем с моим кодом с выводом схемы.