在BiqQuery API中添加而不是覆盖表

时间:2016-11-14 11:46:51

标签: google-bigquery

我目前使用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();

2 个答案:

答案 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的原因。