如何使用 pyspark 中的多行选项将数据框保存到 json 文件中
How to save a dataframe into a json file with multiline option in 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="," none 似乎有效,这些选项仅适用于读不写。请提出这个问题的解决方案
将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"}]
在 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="," none 似乎有效,这些选项仅适用于读不写。请提出这个问题的解决方案
将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"}]