#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. Я не нахожу проблем с моим кодом с выводом схемы.