【问题标题】:Pyspark: Reading JSON data file with no separator between objectsPyspark:读取 JSON 数据文件,对象之间没有分隔符
【发布时间】:2018-06-21 10:55:39
【问题描述】:

我有一个可将数据放入 S3 的 kinesis firehose 传输流。但是在数据文件中,json 对象之间没有分隔符。所以它看起来像这样,

{
  "key1" : "value1",
  "key2" : "value2"
}{
  "key1" : "value1",
  "key2" : "value2"
}

在 Apache Spark 中,我这样做是为了读取数据文件,

df = spark.read.schema(schema).json(path, multiLine=True)

这只能读取文件中的第一个json对象,其余的忽略,因为没有分隔符。

如何在 spark 中使用解决此问题?

【问题讨论】:

  • 修复上游进程?你在 Spark 中所做的任何事情至少都会有些低效和丑陋。
  • 有道理。但我想知道基于 rdd 的方法来解决这个问题。或者当然有更好的方法。
  • 在我脑海中浮现:您可以使用wholTextFiles 并手动解析 - 但性能不佳。如果结构始终由}{ 分隔,您可以尝试使用Hadoop Input format with delimiter,然后修复记录,但它是hack。您可以实现自己的输入格式,但不能在 Python 中实现,而且针对此类问题需要大量代码。但老实说 - 如果过程在你的控制之下,不要浪费时间解决症状,解决问题:)

标签: json apache-spark pyspark databricks amazon-kinesis-firehose


【解决方案1】:

您可以使用sparkContext的wholeTextFiles api将json文件读入Tuple2(filename, whole text),将整个文本解析为多行jsons,最后使用 sqlContext 将其作为 json 读取到数据帧。

sqlContext\
    .read\
    .json(sc
          .wholeTextFiles("path to your multiline json file")
          .values()
          .flatMap(lambda x: x
                   .replace("\n", "#!#")
                   .replace("{#!# ", "{")
                   .replace("#!#}", "}")
                   .replace(",#!#", ",")
                   .split("#!#")))\
    .show()

你应该得到dataframe

+------+------+
|  key1|  key2|
+------+------+
|value1|value2|
|value1|value2|
+------+------+

您可以根据需要修改代码

【讨论】:

  • 您好,我的数据结构如下,如果我希望餐厅 id 作为某一列中的值,纬度和经度在其他列中,您会推荐什么?谢谢! ===> [{“restaurant_id”:“1234”,“信息”:[{“时间戳”:“2020-02-03T00:57:26.000Z”,“经度”:“-123”,“纬度”:“ 456"}{"restaurant_id": "5678", "infos":[{"timestamp": "2....
  • 真的很有帮助。像魅力一样工作。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多