W Prappark chcę zapisać dataframe jako plik JSON, ale w poniższym formacie

Powiedz, że to moja dataframe

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

Jeśli zapiszę powyższy dataframe jako plik JSON, daje wyjście jak poniżej

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

Ale chcę to jak poniżej

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

Próbowałem opcji ("Multiline", "True") i Lineep = "," nie wydaje się działać, te opcje działają tylko dla czytania nie pisać. Proszę zaproponować rozwiązanie tego problemu

2
Naz 1 sierpień 2020, 01:59

1 odpowiedź

Najlepsza odpowiedź

Użyj to_json z collect_list i zapisuj jako .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"}]
4
Shu 1 sierpień 2020, 00:08