BigQuery 更新多表

Posted

技术标签:

【中文标题】BigQuery 更新多表【英文标题】:BigQuery update multi tables 【发布时间】:2014-10-05 09:12:02 【问题描述】:

根据营业日期,我在每日多张桌子上持有大量交易数据。 trascation_20140101 trascation_20140102 trascation_20140103..

流程是这样的: 1.我正在加载到达临时表的一批新文件 2.i 按 transcation_date 字段分组,以注意属于哪个日期 - 对于每个日期,我都会在该日期查询临时表并将其插入到正确的 trasaction_YYYYMMDD 桌子。 3.为了节省时间,我正在并行执行第 2 部分,因为临时表可能包含属于 20 天的数据..

我的挑战是,如果其中一个过程失败而其他过程失败了该怎么办.. 我不能再次运行它,因为它会导致已经成功更新的表出现重复。

我通过管理此更新解决了这些问题,但它似乎太复杂了。

这是处理多表的最佳做法吗? 我将很高兴获得一些最佳实践,以了解其他人在需要根据业务日期将数据加载到多个表时如何处理只需插入日期(这很容易..)

【问题讨论】:

【参考方案1】:

您可以在中间添加一个额外的步骤,而不是直接从今天的临时表移动到永久的营业日期表,而是提取到临时的每日表中,然后将数据复制到永久表中。

    从今天的临时表查询,按天分片到tmp_transaction_YYMMDD。使用WRITE_EMPTYWRITE_TRUNCATE write disposition 使这一步是幂等的。 验证所有预期的tmp_transaction_YYMMDD 表是否存在。如果不是,请调试故障并返回第 1 步。 从每个tmp_transaction_YYMMDD 表运行并行复制作业,以附加到相应的永久transaction_YYMMDD 表。 验证复印作业成功。如果没有,请重试步骤 3 中的各个失败。 删除tmp_transaction_YYMMDD 表。

这样做的好处是您可以在影响任何最终目标表之前捕获查询错误,然后一次复制所有添加的数据。如果复制作业失败,您可能仍然会遇到同样的问题,但它们应该更容易单独调试和重试。

【讨论】:

复制追加的速度有多快? 非常感谢!,我真的很喜欢你的解决方案。非常简单干净。唯一的问题是..如果您的某些副本失败并且在接下来的几个小时内由于停机故障而无法完成,您该怎么办。您如何知道自动恢复失败的特定副本? 您可以使用 jobs.get 检查复制作业的成功或失败。如果您确定哪些作业失败,您可以检查这些作业的副本配置以找出它们的源表和目标表是什么,然后重试/从失败中恢复。 cloud.google.com/bigquery/docs/reference/v2/…【参考方案2】:

我们增加负载的动机是成本,因此我们对“每条记录只接触一次”感兴趣。 我们使用表装饰器来识别增量。我们独立管理增量时间戳,并在运行时将它们添加到查询中。它需要一些逻辑来维护,但不要太复杂。

【讨论】:

但这不是营业日期。它唯一的插入时间戳 与将插入日期连接到表名相同,您可以将业务日期连接到关闭位置或表名(这就是我们所做的)。一旦你在查询中替换了占位符参数,你可以用很少的时间来完成。 当然,但问题是你如何处理回滚。当一些插入成功而一些失败并且您需要在已经插入一些数据后进行回滚时 使用表装饰器,您可以以快照方式查询表,只要它在过去一周内。您可以使用它来回滚到失败之前的某个时间点。 谢谢!所以你使用装饰器来回滚。真的可靠吗?是否更改为表上的所有操作类型(插入追加/复制追加/截断覆盖..)?

以上是关于BigQuery 更新多表的主要内容,如果未能解决你的问题,请参考以下文章

谷歌 bigquery - 更新 sql?

我们可以增加 Bigquery 中的更新配额吗?

使用节点 js 在 BigQuery 中更新数据

Bigquery:无效:非法模式更新

在bigquery中以编程方式更新/插入数据

尽管更新了架构,但 BigQuery 架构错误