【问题标题】:Apache beam : Update BigQuery table row with BigQueryIOApache Beam:使用 BigQueryIO 更新 BigQuery 表行
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 听起来是个明智的选择,会试一试。
  • 如果这对您有用,请考虑接受答案,以便其他人可以轻松找到
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多