Java 使用ApacheBeam将insert发送到BigQuery时如何指定insertId

Java 使用ApacheBeam将insert发送到BigQuery时如何指定insertId,java,google-cloud-platform,google-bigquery,apache-beam,apache-beam-io,Java,Google Cloud Platform,Google Bigquery,Apache Beam,Apache Beam Io,BigQuery支持流式插入的重复数据消除。如何使用Apache Beam使用此功能 为了帮助确保数据一致性,可以为每个插入的行提供insertId。BigQuery会记住此ID至少一分钟。如果您尝试在该时间段内流式传输同一组行,并且设置了insertId属性,则BigQuery将使用insertId属性尽力消除重复数据。您可能必须重试插入,因为在某些错误情况下无法确定流式插入的状态,例如系统和BigQuery之间的网络错误或BigQuery内部错误。如果重试插入,请对同一组行使用相同的插入I

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

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

我在Java文档中找不到这样的功能。

在中,他建议在TableRow中设置insertId。这是正确的吗

BigQuery客户端库具有此功能

  • Pub/Sub+Beam/Dataflow+BigQuery:“恰好一次”应该得到保证,您不需要太担心这一点。当您要求Dataflow使用而不是现在使用插入到BigQuery时,这种保证更为有力

  • Kafka+Beam/Dataflow+BigQuery:如果一条消息可以从Kafka发出多次(例如,如果制作人重试插入),则需要注意重复数据消除。无论是在BigQuery中(根据您的注释,当前实现),还是在带有
    .apply(Distinct.create())
    转换的数据流中


正如Felipe在评论中提到的那样,数据流似乎已经在为自己使用insertId来实现“恰好一次”。因此,我们不能手动指定insertId

你能详细说明你的用例吗?Dataflow/Beam在与BigQuery结合时只应执行一次,而无需手动指定insertId。我的用例如上所述。要在插入到BigQuery时消除重复。所以只需在新行中将insertId指定为列?我知道您想要消除重复。但根据复制源的不同,这可能已经是一个已解决的问题。数据源端没有复制。由于卡夫卡至少支持一次默认交付,所以我认为卡夫卡制作者和消费者之间存在复制的可能性。而且,我猜当对某些错误(例如暂时性网络问题)重试时,数据流可能会多次插入同一行。所以我只想知道如何避免两者的重复。这个问题是关于从dataflow到bigquery的流插入。在我的实际用例中,对重复数据消除的要求并不是很高。所以我认为最简单的方法就是插入到大查询中,然后在查询中消除重复。但我只想知道BigQueryIO(Apache Beam)支持重复数据消除功能。谢谢!但我最初的问题是如何使用Apache Beam中的BigQuery重复数据消除功能。您不能手动操作,因为Dataflow已经在使用insertId来实现所描述的“一次”。好的,我明白了。谢谢你的澄清。谢谢你的提问!我不得不请一些专家来回答:)。包括Pablo,他在上面改进了我的答案,我在Apache Beam文档中找不到关于
.apply(Distinct.create())
转换的信息。因此,如果你能在文件中提到这一点,那将是很有帮助的。