python将pysparkDataframe写入json而不带头

ljsrvy3e  于 2021-05-16  发布在  Spark
关注(0)|答案(1)|浏览(378)

对于之前提出的类似问题,我深表歉意。这个问题在python中。但是我找不到正确的解决方案,我有以下Dataframedf1

SomeJson
=================
[{
         "Number": "1234",
         "Color": "blue",
         "size": "Medium"
     }, {
         "Number": "2222",
         "Color": "red",
         "size": "Small"
     }
]

我正试图把这个Dataframe的内容写成json。

df0.coalesce(300).write.mode('append').json(<json_Path>)

它会引入第一个键,例如:

{
        "SomeJson": [{
                "Number": "1234",
                "Color": "blue",
                "size": "Medium"
            }, {
                "Number": "2222",
                "Color": "red",
                "size": "Small"
            }
        ]
    }

但是,我不想在输出文件中包含{“somejson”:}。我试着写在下面。但是,我在编写自定义python函数以消除第一个头时迷失了方向。非常感谢您的帮助

df0.rdd.map(<custom_function>).saveAsTextFile(<json_Path>)
fae0ux8s

fae0ux8s1#

基于这个答案:将pysparkDataframe转换为python字典列表
你可以这样做:

df0.rdd.map(lambda x: [ele.asDict() for ele in x["SomeJson"]]).saveAsTextFile("data/output.json")

它产生如下输出:

[{'Color': 'blue', 'Number': '1234', 'size': 'Medium'}, {'Color': 'red', 'Number': '2222', 'size': 'Small'}]

编辑:
在读取json时,spark不保持顺序。但是我们可以改变收到的词典的顺序。因为python3中的dictionary保持插入顺序,所以我们只需要考虑插入顺序就可以创建一个新的dictionary。剩下的只是字符串操作。我会这样做的。

required_order = ["Number","Color","size"]

def change_order(row_dict, order):
    temp_dict = {}
    for name in order:
        temp_dict[name] = row_dict[name]
    return temp_dict

df0.rdd.map(lambda x: "{" + ",".join([str(ele) for ele in [change_order(ele.asDict(), required_order) for ele in x["SomeJson"]]]) + "}").saveAsTextFile("data/output.json")

它产生以下输出。

{{'Number': '1234', 'Color': 'blue', 'size': 'Medium'},{'Number': '2222', 'Color': 'red', 'size': 'Small'}}

相关问题