BigQuery:使用 DML 原子地替换日期分区

Posted

技术标签:

【中文标题】BigQuery:使用 DML 原子地替换日期分区【英文标题】:BigQuery: Atomically replace a date partition using DML 【发布时间】:2018-11-07 08:58:29 【问题描述】:

我经常想将一天的数据加载到按日期分区的 BigQuery 表中,以替换已经存在的所有数据。我知道如何对“旧式”数据分区表(具有_PARTITIONTIME 字段的表)执行此操作,但不知道如何使用新式日期分区表(使用普通日期)执行此操作/timestamp 列来指定分区,因为它们不允许使用$ 装饰器。

假设我想在my_table 上执行此操作。对于旧式日期分区表,我使用加载作业完成了此操作,该作业利用了$ 装饰器和WRITE_TRUNCATE 写入处置——例如,我将目标表设置为my_table$20181005

但是,我不确定如何使用 DML 执行等效操作。我发现自己在执行单独的 DELETEINSERT 命令。这不是很好,因为它增加了复杂性、查询的数量,而且操作不是原子的。

我想知道如何使用MERGE 命令执行此操作,以将所有内容包含在单个原子操作中。但是,我无法理解 MERGE 命令的语法,也没有找到此用例的示例。有谁知道这应该怎么做?

理想的答案是一个 DML 语句,它从 source_table 中选择所有列并将其插入到 my_table2018-10-05 日期分区中,删除 @987654333 中的所有现有数据@'s 2018-10-05 日期分区。我们可以假设source_tablemy_table 具有相同的架构,并且my_tableday 列上进行分区,该列的类型为DATE

【问题讨论】:

【参考方案1】:

因为他们不允许使用 $ 装饰器

但它们可以——当您加载到基于列的分区表时,您也可以使用table_name$YYYYMMDD。比如我做了一个分区表:

$ bq query --use_legacy_sql=false "CREATE TABLE tmp_elliottb.PartitionedTable (x INT64, y NUMERIC, date DATE) PARTITION BY date"

然后我加载到一个特定的分区:

$ echo "1,3.14,2018-11-07" > row.csv
$ bq load "tmp_elliottb.PartitionedTable\$20181107" ./row.csv

我尝试将输入数据加载到错误的分区中,并收到错误:

$ echo "1,3.14,2018-11-07" > row.csv
$ bq load "tmp_elliottb.PartitionedTable\$20181105" ./row.csv
Some rows belong to different partitions rather than destination partition 20181105

然后我替换了分区的数据:

$ echo "2,0.11,2018-11-07" > row.csv
$ bq load --replace "tmp_elliottb.PartitionedTable\$20181107" ./row.csv

是的,您可以使用MERGE 来替换分区表的分区的数据,但您也可以使用加载作业。

【讨论】:

谢谢!我回去看看为什么我认为这是不可能的,这是因为我从 Airflow 收到了一条错误消息(在这种情况下,它不能准确地反映 BigQuery API)。对于我的用例来说,这个解决方案比 DML 好得多,因为它处理了随着时间的推移附加更新模式(因此不一致)的情况,我似乎无法用 DML 处理,因为它需要我明确列出所有我要插入表格的列。 @conradlee 那么您是如何设法使用 Airflow 运算符用新数据更新 BQ 表的呢?我有一个场景,其中我的现有表由 DATE 列分区,并且我的增量加载带来了过去三天的数据,当尝试加载数据失败并出现错误 Exception: BigQuery job failed. Final error was: 'reason': 'invalid', 'message': 'Some rows belong to different partitions rather than destination partition 20191202' 非常感谢任何帮助 您好,您能否为多个分区添加将在分区表中执行删除和插入操作的 DML?

以上是关于BigQuery:使用 DML 原子地替换日期分区的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - 分区表上的 DML 支持

使 BigQuery 表数据保持最新

在列出的日期范围之外流式传输到分区表 BigQuery

列中的 BigQuery 日期分区

BigQuery:查询最新分区、要处理的字节数与实际处理的字节数

BigQuery、日期分区表和装饰器