2017-07-10 197 views
0

的json包含结构的结构数组:(存储在minijson.json)JSON解析使用星火

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

我使用的火花版本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) 

我不明白为什么它不能够检测st1st2a领域中存在的JSON。

请帮忙解决这个问题。

回答

0

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

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

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

至极将有一个模式作为

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) 
+0

肯定。我知道这一点。即使我尝试用空数组替换空键。 '“abc”:{}'到'“abc”:[]'它可以工作。但问题是我需要解决现有的json问题。 – desaiankitb

+0

你总是可以自己设置模式。 –

+0

谢谢@Assaf,但这里预定义模式的问题是,对象'st1'和'a'可以有任何级别的嵌套,我们无法控制发送者的模式。 – desaiankitb