使用Spark使用包含Struct的Struct的数组进行Json解析
my json:(存储在minijson.json中) 我正在使用spark版本2.1.0来读取json 阅读代码:使用Spark使用包含Struct的Struct的数组进行Json解析,json,apache-spark,pyspark,Json,Apache Spark,Pyspark,my json:(存储在minijson.json中) 我正在使用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
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
字段
请帮忙解决这个问题 Spark不会创建列,如果该键有空键,如
“abc”:{}
它必须至少有一个键和值才能创建列
下面是添加键和值的简单示例
{
"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)
对我知道这一点。甚至我也尝试用空数组viz替换空键<代码>“abc”:{}到<代码>“abc”:[]并且它可以工作。但问题是,我需要对我发布的现有json有一个解决方案。你可以自己设置模式。谢谢@Assaf,但这里预定义模式的问题是,对象
st1
和a
可以有任何级别的嵌套,我们无法控制发件人的架构。@desaiankitb您可以尝试使用外部工具提取json架构,然后手动将其转换为spark架构
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)