【问题标题】:Apache Spark Read One Complex JSON File Per Record RDD or DFApache Spark 每条记录 RDD 或 DF 读取一个复杂的 JSON 文件
【发布时间】:2016-01-07 12:18:58
【问题描述】:

我有一个 HDFS 目录,其中包含以下 JSON 文件格式:

https://www.hl7.org/fhir/bundle-transaction.json.html

我希望做的是找到一种方法来扁平化每个单独的文件以成为一个 df 记录或 rdd 元组。我已经尝试了所有我能想到的使用 read.json()、wholeTextFiles() 等的方法。

如果有人有任何最佳实践建议或指示,我们将不胜感激。

【问题讨论】:

  • 我查看了那个json,如果你想要一个元组,你希望什么是关键?示例帮助
  • 为什么 wholeTextFiles 不适合你?
  • @Pangea 这个实例与我的实例略有不同。在我的 FHIR 包中,始终只有一个可识别的患者资源。所以理想情况下使用每个文件唯一的 uuid。我希望这不是太模糊。
  • @JustinPihony 好吧,我可以使用 sc.wholeTextFiles() 成功阅读该示例,但在考虑到结构之后如何有效地展平它们,我对此持空白。

标签: json apache-spark


【解决方案1】:

通过wholeTextFiles 加载类似这样的内容:

sc.wholeTextFiles(...) //RDD[(FileName, JSON)
  .map(...processJSON...) //RDD[JsonObject]

然后,您可以简单地调用.toDF 方法,以便它从您的JsonObject 推断。

processJSON 方法而言,您可以使用Play json parser 之类的方法

【讨论】:

  • 这当然是一种方式。我对 Play json 解析器不太熟悉。刚刚将 pyspark 移动到 scala spark。谢谢你的提示。我去看看。
  • 好吧,虽然我认为这是一个潜在的选择,但 wholeTextFiles 似乎特别需要内存。我还得考虑一下“processJSON”展平步骤。鉴于一个包可以包含任意数量的资源和这些资源的任意嵌套深度,认为这一点将是棘手的部分。
【解决方案2】:

mapPartitions 在必须处理以不同元素可以位于不同行的方式结构化的数据时使用。我使用 mapPartitions 处理过 JSON 和 XML。

mapPartitions 一次处理整个数据块,而不是单个元素。虽然您应该能够将 DataFrameReader API 与 JSON 一起使用,但 mapPartitions 绝对可以随心所欲。我没有将 JSON 文件展平的确切代码,但我相信您可以弄清楚。请记住,输出必须是可迭代类型。

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 2018-08-19
    • 2017-03-05
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多