使用 spark 展平嵌套的 json 文档并加载到 Elasticsearch

Posted

技术标签:

【中文标题】使用 spark 展平嵌套的 json 文档并加载到 Elasticsearch【英文标题】:Flatten a nested json document using spark and load into Elasticsearch 【发布时间】:2017-04-28 14:08:03 【问题描述】:

我对 Spark 和 java 编程比较陌生。给定一个包含嵌套对象的 json 文件,我需要展平其结构(对内容进行变性)并使用 spark 加载到 Elastisearch。

例如,

如果我的 example.json 的内容是:


  "title": "Nest eggs",
  "body":  "Making your money work...",
  "tags":  [ "cash", "shares" ],
  "comments": 
    
      "name":    "John Smith",
      "comment": "Great article",
      "age":     28,
      "stars":   4,
      "date":    "2014-09-01"
    
  "owner": 
    
      "name":    "John Smith",
      "age":     28,
    

我想以下面的格式重建它并使用 spark 将其加载到 ES 中。


  "title": "Nest eggs",
  "body":  "Making your money work...",
  "tags":  [ "cash", "shares" ],
  "comments_name": "John Smith",
  "comments_comment": "Great article",
  "comments_age":     28
  "comments_stars":   4,
  "comments_date":    "2014-09-01"
  "owner_name": "John Smith",
  "owner_age":     28,
 

如果嵌套对象之一为空,则内容也可以为空。

感谢任何帮助。谢谢

【问题讨论】:

在语义上,"comments.name"name 嵌套而不是comments 字段)和"comments_name"(***字段)之间没有区别 同意。它可以是任何一种形式。在将其加载到 ES 中的索引之前,我希望它是一个扁平化的 json。 【参考方案1】:

您正在寻找的答案是here。

总而言之,您可以通过点符号选择所需的字段。

val df = sqlcontext.read.json(json)    
val flattened = df.select($"title", $"comments.name")

【讨论】:

我认为他要求自动解决方案

以上是关于使用 spark 展平嵌套的 json 文档并加载到 Elasticsearch的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark DataFrame 中展平嵌套数组

如何使用 Java 手动展平 Elasticsearch 嵌套的 JSON 文档?

如何使用 pyspark 在 aws 胶水中展平嵌套 json 中的数组?

如何将 JSON 格式的数据展平为 spark 数据框

使用具有相同名称的嵌套子属性展平 Spark JSON 数据框

Python:展平多个嵌套的字典并追加