2016-11-14 15 views
1

私は現在、bigquery.tabledata().insertAll()を使用してBigQueryにデータを格納しています。ただし、前のすべてのコンテンツを追加するのではなく上書きします。既定の動作を変更する方法はありますか?そうするために別の方法を使用すべきですか?以下BiqQuery APIのテーブルを上書きする代わりに追加する

コード:

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(); 

答えて

1

解決策は、[グローバルに]一意のIDをInserIDとして割り当てることです。
BigQueryは、InsertIdプロパティを使用して、ベストエフォートベースで重複挿入リクエストを検出します。
これを無視すると、不要な重複行がある可能性があります。
続きを見るhttps://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency

0

ああ、答えを見つけました。 同一(設定されている場合)のIDがsetInsertId(id)であるインサートは、同じIDのnextで上書きされます。

解決方法:InsertIdを設定しないでください。

EDIT:@Mikhail Berlayantの反応と、なぜInsertIdについて気にする必要があるのか​​を見てください。

関連する問題