En Pyspark quiero guardar un marco de datos como un archivo json pero en el siguiente formato

Di que este es mi marco de datos

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

Si guardo el marco de datos anterior como un archivo json, da una salida como la siguiente

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

Pero lo quiero como el de abajo

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

He probado la opción ("multiLine", "true") y lineSep = "," ninguna parece funcionar, estas opciones funcionan solo para lectura, no para escritura. Sugiera una solución para este problema.

2
Naz 1 ago. 2020 a las 01:59

1 respuesta

La mejor respuesta

Utilice to_json con la función collect_list y escriba como .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 ago. 2020 a las 00:08