【问题标题】:how to truncate the staging table?如何截断临时表?
【发布时间】:2018-12-29 20:27:18
【问题描述】:

为了保持列的唯一性,我的几个客户端将数据流式传输到 BQ 中的临时表中(如果主表中不存在,则重试 2 次,间隔 10 分钟),并使用另一个 cron 作业将临时表合并到列每隔几分钟分区表。

如果暂存表合并到主表中,我需要截断它,但我的客户似乎一直在将数据流式传输到其中。这里有什么推荐吗?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    警告:不要截断正在接收流式传输结果的表。

    https://cloud.google.com/bigquery/troubleshooting-errors#streaming:

    删除和/或重新创建表可能会在一段时间内创建流式插入有效地传递到旧表并且不会出现在新创建的表中。

    截断表的数据(例如,通过使用 WRITE_TRUNCATE 的 writeDisposition 的查询作业)可能同样会导致一致性期间的后续插入被删除。

    有关流式传输到 BigQuery 时的替代最佳做法,请参阅:

    在这种情况下 - 为什么不让您的多个客户改为写入 Pub/Sub?然后,您可以使用 Dataflow 将这些数据移动到永久表中。

    奖励:Pub/sub + Dataflow + BigQuery 可以保证“Exactly Once”交付。

    【讨论】:

    • 因为锁定了UPSERT语义,我需要把数据放到一个staging表中,并通过MERGE自动将staging表合并到主表。我希望以事务方式运行 MERGE 和 TRUNCATE,因此我不需要设计登台表切换机制。有可能吗?
    • 错字锁定 -> 缺少
    • BigQuery 在设计上是仅追加的,并且是非事务性的,因此您尝试做的事情听起来不像 BigQuery 的正确方法。您是否考虑过@FelipeHoffa 的建议,即仅将 Pub/Sub + Dataflow 和 Bigquery 用作永久目的地?
    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2011-08-27
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多