如何使用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的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中解析复杂的嵌套JSON?

如何使用bigquery流将嵌套数据插入现有记录

RestKit 0.20:映射复杂的动态嵌套 JSON

如何使用 Python 将嵌套字典/json 插入 MySQL 表

如何将复杂(嵌套)对象解析为 JSON 并在 Flutter 中使用 HTTP 将其发送到服务器?

复杂JSON字符串转换为Java嵌套对象的方法