繁体   English   中英

如何在使用Apache Beam将插入插入BigQuery时指定insertId

[英]How to specify insertId when spreaming insert to BigQuery using Apache Beam

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

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

为帮助确保数据一致性,您可以为每个插入的行提供insertId。 BigQuery会记住此ID至少一分钟。 如果您尝试在该时间段内流式传输相同的行集并且设置了insertId属性,则BigQuery会使用insertId属性在尽力而为的基础上对数据进行重复数据删除。 您可能必须重试插入,因为在某些错误条件下无法确定流式插入的状态,例如系统和BigQuery之间的网络错误或BigQuery中的内部错误。 如果重试插入,请对同一组行使用相同的insertId,以便BigQuery可以尝试对数据进行重复数据删除。 有关更多信息,请参阅流式插入疑难解答

我在Java doc中找不到这样的功能。 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

  • Pub / Sub + Beam / Dataflow + BigQuery :应该保证“完全一次”,你不需要担心这个。 当你要求Dataflow使用FILE_LOADS而不是STREAMING_INSERTS插入BigQuery时,这种保证会更强。

  • Kafka + Beam / Dataflow + BigQuery :如果消息可以从Kafka多次发出(例如,如果生产者重新插入插入),那么您需要处理重复数据删除。 在BigQuery中(根据您的评论当前实现),或在具有.apply(Distinct.create())转换的Dataflow中。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM