我正在使用来自xAPI系统的JSON,并且JSON看起来与link中可用于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);
答案 0 :(得分:0)
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
更正后)被导入using schema auto-detection,则这是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文件后,只需use the BigQuery Java API即可将其上传,而无需复杂的流程和第三方库来预先序列化JSON。
来源: