Apache beam:使用BigQueryIO更新BigQuery表行

时间:2017-09-06 13:44:13

标签: google-bigquery google-cloud-platform google-cloud-dataflow

我们使用以下代码将记录写入BigQuery:

BigQueryIO.writeTableRows()
    .to("table")
    .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)
    .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
    .withSchema(schema);

使用此代码,当我们执行回填时,一些记录会再次发送到此数据流,从而导致BigQuery表中出现重复。有没有办法根据数据流中的字段名称配置upsert操作?

2 个答案:

答案 0 :(得分:4)

我有一个非常相似的用例,我们决定通过在表顶部创建一个视图以对数据进行重复数据删除来解决此问题,然后指向正在访问原始表的任何内容现在从该视图中进行查询。

BigQuery deduplication and partitioned table是一个很好的参考。 https://wecode.wepay.com/posts/bigquery-wepay

基本上,您需要确保您具有某种last_updated列,以及一个ID列,该ID列唯一地标识该行。然后,您可以创建一个视图,以获取每个ID的最新版本的所有数据。由于您正在查询视图,因此可能会有一些小的性能损失,但是我们发现它可以忽略不计。

答案 1 :(得分:1)

这仍然是与BigQueryIO编写器的差距......似乎是一个主要限制,大多数工作负载将每晚加载更多数据,但在任何给定的夜晚可能需要重新运行该集。不要想截断整个表,但也许只是截断那个运行/一组键就可以了,然后附加到实际的更新。理想情况下,有一些TRUNCATE_KEY_SET或正常的UPDATE ....