使用 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 中存在的 st1
、st2
和 a
字段。
请帮助解决这个问题。
【问题讨论】:
【参考方案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,但这里预定义架构的问题是,对象st1
和a
可以有任何级别的嵌套,我们无法控制发件人的架构。
@desaiankitb 可以尝试使用外部工具提取json schema,然后手动转换为spark schema以上是关于使用 Spark 使用包含结构的结构的数组进行 Json 解析的主要内容,如果未能解决你的问题,请参考以下文章
如何基于相等性检查在 Spark 中使用内部数组查询嵌套 json