【问题标题】:How to save a json from dataframe with specific format?如何从具有特定格式的数据框中保存 json?
【发布时间】:2019-03-25 18:21:25
【问题描述】:

我正在尝试将以下 pyspark 数据帧保存到 json:

ID VARIABLE_1
1      1
2      0
3      0
4      1
5      0

但我需要 json 是这样的:

{ "1": {"VARIABLE_1": 1} }
{ "2": {"VARIABLE_1": 0} }
{ "3": {"VARIABLE_1": 0} }
{ "4": {"VARIABLE_1": 1} }
{ "5": {"VARIABLE_1": 0} }

保存到 json 时,我得到以下信息:

{ "ID":"1", "VARIABLE_1": 1} 
{ "ID":"2", "VARIABLE_1": 0} 
{ "ID":"3", "VARIABLE_1": 0} 
{ "ID":"4", "VARIABLE_1": 1} 
{ "ID":"5", "VARIABLE_1": 0} 

我正在尝试保存

df.write.mode("overwrite").format("json").save(json_path)

我尝试使用 create_map 并得到这样的数据框:

NEW_COLUMN_NAME
{ "1": {"VARIABLE_1": 1} }
{ "2": {"VARIABLE_1": 0} }
{ "3": {"VARIABLE_1": 0} }
{ "4": {"VARIABLE_1": 1} }
{ "5": {"VARIABLE_1": 0} } 

但是当我尝试将这个新数据框保存到 json 时,我得到:

{"NEW_COLUMN_NAME":{"1":{"VARIABLE_1":1}}}
{"NEW_COLUMN_NAME":{"2":{"VARIABLE_1":0}}}
{"NEW_COLUMN_NAME":{"3":{"VARIABLE_1":0}}}
{"NEW_COLUMN_NAME":{"4":{"VARIABLE_1":1}}}
{"NEW_COLUMN_NAME":{"5":{"VARIABLE_1":0}}}

我真的不知道该怎么办,有人知道吗?

谢谢!

【问题讨论】:

  • json 格式将包含名称和值,在保存为 json 格式时不能删除一个名称(ID)并保留另一个名称(VARIABLE_1)
  • 一旦你得到你想要的格式的数据(使用create_map)尝试使用.write.text(json_path)将字符串写入文件。像这样的东西:df.select("NEW_COLUMN_NAME").write.text(json_path)
  • 当我尝试 write.text 时,它显示“文本数据源不支持地图”,如果我尝试 Cast('string'),它会从 {"1": {"VARIABLE_1": 1} } 到 [1-> [VARIABLE_1-> 0]]
  • 我的 spark 是 2.4 版
  • 我无法在 2.4 上进行测试,但 to_json 可以在 MapType() 列上工作吗? df.select(to_json("NEW_COLUMN_NAME")).write.text(json_path)。如果没有,这有点麻烦,但您可以手动构建字符串:df.select(concat(lit('{"'), "ID", lit('":{"VARIABLE_1":"'), "VARIABLE_1", lit('"}}')).write.text(json_path)

标签: json pyspark


【解决方案1】:

我是如何解决这个问题的:

-使用 collect() 收集 create_map 数据帧

-用于为数据帧的每一行制作一个字典

-使用 json.dumps 和字典

-使用 open(path, "w") 保存

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 2020-09-07
    • 2021-01-01
    • 2014-02-21
    相关资源
    最近更新 更多