【问题标题】:Split JSON payloads into multiple lines将 JSON 有效负载拆分为多行
【发布时间】:2021-12-07 07:33:18
【问题描述】:

我有一个要求,在文件的一行中生成多个 JSON 有效负载记录(末尾没有换行符,确切的 JSON 记录太长,无法在此处添加)。

示例:sample.json(来自源代码) [{complex-json-record1},{complex-json-record2},{complex-json-record3},{complex-json-record4}...]

有没有办法在每个 JSON 记录之后在 Python/PySpark/Pandas 中添加换行符(换行符)?

这样至少我可以每行获得一条记录。

仍在努力将该 JSON 转换为 Hive 表。

谢谢!

【问题讨论】:

  • 查看 JSON 规范,您可以有效地在标记之间插入任何空格。有一种称为漂亮打印的算法,也许这就是你所追求的。浏览器有一些工具可以以人类可读的方式显示 JSON,例如JSON发现。在命令行上有jq

标签: python json pyspark


【解决方案1】:

试试这个:

import json
print(json.dumps({"key1": 42, "key2": 142}, sort_keys=True, indent=4))

【讨论】:

  • 很棒的技巧,解决了大问题,非常感谢。
  • 我现在有不同的要求,需要每行获取一条 JSON 记录(而不是将一条 JSON 记录拆分为多行)。 {rec1},{rec2},{rec3} // 所有 JSON 记录都在行 {rec1}, // 完整的 JSON rec-1 记录在一行中。 {rec2}, // 在一行中完成 JSON rec-2 记录。 {rec3} // 在一行中完成 JSON rec-2 记录。
  • 数据=[{"key1": 42, "x": 1},{"key2": 142, "x": 2},{"key3": 142, "x": 3}] 到 {"key1": 42, "x": 1} {"key2": 142, "x": 2} {"key3": 142, "x": 3} 我使用下面的代码,但我需要重写,效率不高,因为我从源接收数据文件,我只需要在展平它时格式化它以将数据存储到 Hive 中。 with open('/home/h015851/tst.json', 'w') as f: ... for datum in data: ... f.write(json.dumps(datum)) ... f.write( "\n")
  • 您可以使用 mydata = json.loads() 将 JSON 加载到 python 对象中,然后迭代列表。像这样: import json mydata = json.loads(myjsondata) for item in mydata: print(json.dumps(item))
  • 最后,我的要求成功了,我得到了预期的输出......谢谢先生。 ''' >>> custJsonTableDF = spark.sql(cust_json_query).repartition(500) >>> data=str(custJsonTableDF.select(col('json_string')).first()[0]) >>> mydata = json.loads(data) >>> res = "json_str" + "\n" >>> 对于 mydata 中的项目: res = res + str(item) + "\n" >>> from io import StringIO >>>导入 io >>> val = io.StringIO(res) >>> df = pd.read_csv(val, sep='\+s') >>> df1=spark.createDataFrame(df) '''
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多