使用 Apache Beam 向 BigQuery 发送插入时如何指定 insertId

Yoh*_*shi 5 java google-bigquery google-cloud-platform apache-beam apache-beam-io

BigQuery 支持对流式插入进行重复数据删除。如何使用 Apache Beam 使用此功能?

https://cloud.google.com/bigquery/streaming-data-into-bigquery#dataconsistency

为了帮助确保数据一致性,您可以为每个插入的行提供 insertId。BigQuery 至少会记住此 ID 一分钟。如果您尝试在该时间段内流式传输同一组行并且设置了 insertId 属性,BigQuery 会使用 insertId 属性尽最大努力去重复数据。您可能必须重试插入,因为在某些错误情况下无法确定流式插入的状态,例如您的系统和 BigQuery 之间的网络错误或 BigQuery 中的内部错误。如果您重试插入,请对同一组行使用相同的 insertId,以便 BigQuery 可以尝试对您的数据进行重复数据删除。有关详细信息,请参阅对流式插入进行故障排除。

我在 Java 文档中找不到这样的功能。 https://beam.apache.org/releases/javadoc/2.9.0/org/apache/beam/sdk/io/gcp/bigquery/BigQueryIO.Write.html

这个问题中,他建议在 TableRow 中设置 insertId。这样对吗?

https://developers.google.com/resources/api-libraries/documentation/bigquery/v2/java/latest/com/google/api/services/bigquery/model/TableRow.html?is-external=true

BigQuery 客户端库具有此功能。

https://googleapis.github.io/google-cloud-java/google-cloud-clients/apidocs/index.html?com/google/cloud/bigquery/package-summary.html https://github.com/googleapis /google-cloud-java/blob/master/google-cloud-clients/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/InsertAllRequest.java#L134

Yoh*_*shi 1

正如 Felipe 在评论中提到的,Dataflow 似乎已经在使用 insertId 来实现“恰好一次”。所以我们不能手动指定insertId。