![](/img/trans.png)
[英]how to flatten complex nested json in spark dataframe using java dynamically
[英]How to insert a complex dynamic nested json into bigquery using java
我正在使用来自xAPI系统的JSON,并且JSON看起来与BigQuery 链接中的JSON类似,其中BigQuery的架构略有更改。
示例:在子元素verb
的JSON中
"verb":{
"id":"http://adlnet.gov/expapi/verbs/failed",
"display":{
"en-US":"failed"
}
}
该架构如下所示:
verb RECORD NULLABLE
verb.id STRING NULLABLE
verb.display RECORD REPEATED
verb.display.stringValue STRING NULLABLE
verb.display.languageCode STRING NULLABLE
如果我使用杰克逊ObjectMapper
,则将解析JSON,但不会将其插入到BigQuery中,因为在JSON中, display
仅是一条记录,而在BigQuery中则是记录列表,因此似乎不匹配,并且我无法插入此类自定义字段。
请提供任何解决此问题的解决方案,简而言之,只要上面链接中的JSON中带有“ en”的任何地方,我都面临此问题。
任何帮助表示赞赏。
ObjectMapper objectmapper = new ObjectMapper();
objectmapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, false);
objectmapper.setSerializationInclusion(Include.NON_NULL);
ashMap<String, Object> tempResult = objectmapper.readValue(stageJson, HashMap.class);
display
节点也是BigQuery中的一条记录。 这是必须设置模式的方法:
[
{
"name": "verb",
"type": "RECORD",
"mode": "NULLABLE",
"fields": [
{
"name": "id",
"type": "STRING",
"mode": "NULLABLE"
},
{
"name": "display",
"type": "RECORD",
"mode": "REPEATED",
"fields": [
{
"name": "enUS",
"type": "STRING",
"mode": "NULLABLE"
}
]
}
]
}
]
verb
示例的问题是缺少包含该字段的方括号; 此外,还有用连字符的另一个问题“ - ”中en-US
:作为字段名只能包含字母,数字和下划线。 必须将其设置为例如enUS
。
如果您的verb
示例(在enUs
校正之后)是使用模式自动检测导入的,则以下是UI中显示的模式 :
verb RECORD NULLABLE
verb.display RECORD NULLABLE
verb.display.enUS STRING NULLABLE
verb.id STRING NULLABLE
类型是正确的,但是display
模式被检测为NULLABLE
,因为没有[ ]
。
由于BigQuery JSON导入格式以换行符分隔,因此此导入必须采用以下格式:
{"verb":{"id":"http://adlnet.gov/expapi/verbs/failed","display":[{"enUS":"failed"}]}}
然后display
模式被检测为REPEATED
。
一旦对您的架构进行了排序并拥有格式正确且有效的JSON文件,则只需使用BigQuery Java API上载它,而无需复杂的流程和第三方库即可预先序列化JSON。
资源:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.