使用 Spark 使用包含结构的结构的数组进行 Json 解析

Posted

技术标签:

【中文标题】使用 Spark 使用包含结构的结构的数组进行 Json 解析【英文标题】:Json Parsing with Array containing Struct of Struct using Spark 【发布时间】:2017-07-10 06:46:27 【问题描述】:

我的json:(存储在minijson.json中)


  "arr": [
    
      "st1": ,
      "st2": 
        "a": 
      ,
      "val": 0.0,
      "x": "1"
    
  ]

我正在使用 spark 2.1.0 版本来读取 json。

阅读代码:

minidf = spark.read.json("minijson.json")
minidf.printSchema()

输出:

root
 |-- arr: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- val: double (nullable = true)
 |    |    |-- x: string (nullable = true)

我不明白为什么它无法检测到 json 中存在的 st1st2a 字段。

请帮助解决这个问题。

【问题讨论】:

【参考方案1】:

如果键有空键"abc": ,Spark 不会创建列。它必须至少有一个键和值才能创建一个列。

下面是一个简单的例子,通过添加键和值


"arr": [
  
    "st1": 
    "name": ""
  ,
    "st2": 
      "a": 
        "abc": ""
      
    ,
    "val": 0.0,
    "x": "1"
  ]

Wich 的架构为

root
 |-- st1: struct (nullable = true)
 |    |-- name: string (nullable = true)
 |-- st2: struct (nullable = true)
 |    |-- a: struct (nullable = true)
 |    |    |-- abc: string (nullable = true)
 |-- val: double (nullable = true)
 |-- x: string (nullable = true)

【讨论】:

是的。我知道这一点。甚至我尝试用空数组即替换空键。 "abc":"abc":[] 并且有效。但问题是我需要解决我已经发布的现有 json 问题。 您始终可以自己设置架构。 感谢@Assaf,但这里预定义架构的问题是,对象st1a 可以有任何级别的嵌套,我们无法控制发件人的架构。 @desaiankitb 可以尝试使用外部工具提取json schema,然后手动转换为spark schema

以上是关于使用 Spark 使用包含结构的结构的数组进行 Json 解析的主要内容,如果未能解决你的问题,请参考以下文章

如何基于相等性检查在 Spark 中使用内部数组查询嵌套 json

Spark UDF 到自定义排序结构数组

在 Spark 数据帧内的映射中对结构数组进行聚合

如何使用group by聚合spark中的结构数组

如何使用 udf 将空列添加到 Spark 中的复杂数组结构

Spark 处理非结构化文件