Как сохранить фрейм данных в файл json с многострочным вариантом в pyspark

В 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 =,, похоже, ничего не работает, эти параметры работают только для чтения, а не для записи. Пожалуйста, предложите решение этой проблемы


person Naz    schedule 31.07.2020    source источник


Ответы (1)


Используйте 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"}]
person Shu    schedule 01.08.2020