如何使用java将复杂的动态嵌套json插入bigquery
Posted
技术标签:
【中文标题】如何使用java将复杂的动态嵌套json插入bigquery【英文标题】:How to insert a complex dynamic nested json into bigquery using java 【发布时间】:2019-01-14 09:32:27 【问题描述】:我正在使用来自 xAPI 系统的 JSON,该 JSON 看起来类似于 BigQuery 中 link 中可用的 JSON,其中 BigQuery 的架构略有改变。
示例:在 JSON 中为子元素 verb
"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
如果我使用 jackson 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);
【问题讨论】:
你的代码中有ashMap
,大概你的意思是HashMap
是的,我正在尝试根据架构将 json 转换为 hashmap(即键值对)
就像对象映射器将动词转换为类似 verb=id=id.tincanapi.com/verb/viewed ,display=en=viewed 的东西,我想将其转换为 verb=id=@ 987654323@ ,display=[languageCode=en, stringValue=viewed]
【参考方案1】:
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。
来源:
Specifying a Schema
Specifying nested and repeated columns
【讨论】:
过去 1 小时内有 10(十)次更新?!没有人催你——你能不能集中精力做一个最后的更新,这样它就不会轰炸 SO UI! ;o) 我只是重新措辞,这是为了更好,我现在实际上已经完成了。感谢您的反馈! 我知道/我明白了-只是想确保您意识到-您的每一个更新都在 UI 中弹出-不是进行此类更新的最佳方式-我通常在本地进行所有编辑然后进行更新 - 只是想提一下 o) @alp 实际上我无法更改源 json 模式结构或大查询模式。我只需要以相同的方式映射它以上是关于如何使用java将复杂的动态嵌套json插入bigquery的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python 将嵌套字典/json 插入 MySQL 表