如何使用Java

时间:2019-01-14 09:32:28

标签: java json google-bigquery

我正在使用来自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);

1 个答案:

答案 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。

来源:

Specifying a Schema

Specifying nested and repeated columns