我目前使用bigquery.tabledata().insertAll()
将数据放入BigQuery。但是它会覆盖所有以前的内容而不是附加它。有没有办法改变默认行为,还是应该使用其他方法呢?
以下代码:
GoogleCredential credential = GoogleCredential.fromStream(...);
if (credential.createScopedRequired()) {
credential = credential.createScoped(BigqueryScopes.all());
}
bigquery = new Bigquery.Builder(new NetHttpTransport(), new GsonFactory(), credential).setApplicationName("Bigquery Samples").build();
TableDataInsertAllRequest.Rows r = new TableDataInsertAllRequest.Rows();
r.setInsertId("123");
ObjectMapper m = new ObjectMapper();
Map<String,Object> props = m.convertValue(person, Map.class);
r.setJson(props);
TableDataInsertAllRequest content =
new TableDataInsertAllRequest().setRows(Arrays.asList(r));
content.setSkipInvalidRows(true);
content.setIgnoreUnknownValues(true);
TableDataInsertAllResponse execute = bigquery.tabledata().insertAll("", "", "", content).execute();
答案 0 :(得分:1)
解决方案是将[全局]唯一ID指定为InserID BigQuery使用InsertId属性以尽力而为的方式检测重复的插入请求 如果你忽略这一点 - 你最终可能会有不必要的重复行! 请参阅https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency
中的详情答案 1 :(得分:0)
哦,找到了答案。
setInsertId(id)
之后具有相同(如果已设置)ID的插入将被具有相同ID的下一个覆盖。
解决方案:不要设置InsertId。
编辑:请参阅@Mikhail Berlayant回复以及您应该关注InsertId的原因。