我使用带有google dataflow runner的apache beam将数据从kafka传输到BigQuery。 我想利用insertId进行重复数据删除,我发现谷歌文档中描述了这一点。但是即使插件在几秒钟之内发生,我仍然会看到很多行具有相同的insertId。 现在我想知道我可能没有正确使用API来利用BQ提供的流媒体插入的重复数据删除机制。
我在写入梁的代码如下:
payments.apply("Write Fx Payments to BQ", BigQueryIO.<FxPayment>write()
.withFormatFunction(ps -> FxTableRowConverter.convertFxPaymentToTableRow(ps))
.to(bqTradePaymentTable)
.withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_NEVER)
.withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND));
除了所有其他字段,我在FxTableRowConverter.convertFxPaymentToTableRow方法中直接在TableRow上设置insertId作为格式函数传递给BigQueryIO:
row.set("insertId", insertId);
我还将该字段添加为BQ的列。没有它,插入失败(显然)。 除了将其添加到TableRow对象之外,我无法直接在BigQueryIO上找到任何其他方法来设置insertId。
这是使用它的正确方法吗?因为它对我不起作用,所以即使我不应该看到许多重复,因为就像我已经提到的那样插入在几秒钟内发生。 BigQuery doc声明流缓冲区保持insertId至少一分钟。