Как сохранить фрейм данных в файл json с многострочным вариантом в pyspark - PullRequest
2 голосов
/ 01 августа 2020

В Pyspark я хочу сохранить фрейм данных как файл json, но в формате ниже

Скажите, что это мой фрейм данных

>>> rdd1.show()
+----------+-----+
|        f1|   f2|
+----------+-----+
|AAAAAAAAAA|99999|
| BBBBBBBBB|99999|
| CCCCCCCCC|99999|
+----------+-----+

, если я сохраню вышеуказанный фрейм данных как json файл, он дает результат, как показано ниже

>>>rdd1.coalesce(1).write.json("file:///test_directory/sample4")
{"f1":"AAAAAAAAAA","f2":"99999"}
{"f1":"BBBBBBBBB","f2":"99999"}
{"f1":"CCCCCCCCC","f2":"99999"}

Но я хочу, чтобы он выглядел как показано ниже

[{"f1":"AAAAAAAAAA","f2":"99999"},{"f1":"BBBBBBBBB","f2":"99999"},{"f1":"CCCCCCCCC","f2":"99999"}]

Я пробовал option ("multiLine", "true" ) и lineSep = "," кажется, что ничего не работает, эти параметры работают только для чтения, а не для записи. Предложите решение этой проблемы

1 Ответ

3 голосов
/ 01 августа 2020

Используйте to_json с функцией collect_list и напишите как .text().

Example:

df.show()
#+-----+-----+
#|   f1|   f2|
#+-----+-----+
#|AAAAA| 9999|
#|  BBB|99999|
#| CCCC| 9999|
#+-----+-----+

from pyspark.sql.functions import *

df.agg(to_json(collect_list(struct(col("f1"),col("f2")))).alias("d")).\
write.\
mode("overwrite").\
text("<path>")

#output
#[{"f1":"AAAAA","f2":"9999"},{"f1":"BBB","f2":"99999"},{"f1":"CCCC","f2":"9999"}]
...