【发布时间】:2018-02-15 01:04:29
【问题描述】:
我们正在使用以下代码将记录写入 BigQuery:
BigQueryIO.writeTableRows()
.to("table")
.withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED)
.withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
.withSchema(schema);
使用此代码,当我们执行回填时,一些记录会再次发送到此数据流,从而导致 BigQuery 表中出现重复。有没有办法根据数据流中的字段名配置upsert操作?
【问题讨论】:
-
您能否在您的问题中详细说明回填过程?也许有一种方法可以避免它并使用单个流管道。
-
@Jkff 我们有一个数据流管道,其中事件被流式传输到大查询中。现在,我们经常会遇到某某时间之间的事件不正确或某些事件丢失的情况。在这些情况下,我们将所有事件(在源中更正它们之后)重新播放到管道。我们想要实现的是,如果记录已经存在,数据流应该根据某个 id 更新有效负载。
-
哦。如果要重新加载整个数据,是否可以只使用 WRITE_TRUNCATE WriteDisposition,这样表就会被覆盖?
-
它不是重新加载所有数据,它只是重放一些事件。所以,很遗憾,
WRITE_TRUNCATE无济于事。 -
我明白了。作为一种解决方法,我建议将数据加载到临时表中,并在管道完成后,运行 Dremel DML 查询cloud.google.com/bigquery/docs/reference/standard-sql/… 将其插入到原始表中。同时随时提交 JIRA 以在 BigQueryIO 中原生支持 DML。
标签: google-bigquery google-cloud-platform google-cloud-dataflow