将 Update 语句与 _PARTITIONDATE 伪列一起使用

Using Update statement with the _PARTITIONDATE Pseudo-column

我正在尝试更新 BigQuery 中的一个 table,它在 _PARTITIONTIME 上分区并且非常困难。

源是我需要用来回填目标的目标的摘录。目标是一个大分区 table.

要将数据从源移动到目标,我试过这个:

update t1 AS destination
set destination._PARTITIONTIME = '2022-02-09'
from t2 as source
WHERE source.id <> "1";

因为它说更新需要 WHERE 子句,但是当我 运行 它时,我收到一条消息“update/merge 每个目标行最多只能匹配一个源行” .我试过……其他方法太多了,我都记不住了。 INSERT INTO 早期看起来很简单,但它要我指定列名,而这些 table 每个都有大约 800 列,所以这不太理想。

我本以为最近的尝试会奏效,因为如果我这样做了

select * from source where source.id <> "1";

事实上,我得到的结果完全符合我的预期,因此该查询可以正常运行,但由于某种原因它无法加载数据。这很有趣,因为我通过 运行 沿着以下行创建了源 table:

select * from destination where DATE(createddate) = '2022-02-09' and DATE(_PARTITIONTIME) = '2022-02-10'

在这种情况下,有没有办法让 Insert Into 为我工作?如果没有,有人推荐其他方法吗?

您可以使用 bq 命令行工具(通常与 gcloud 命令行实用程序一起提供)来 运行 一个将覆盖目标中的分区的查询 table 你的查询结果:

bq query --allow_large_results --replace --noflatten_results --destination_table 'target_db.target_table220209' "select field1, field2, field3 from source_db.source_table where _PARTITIONTIME = '2022-02-09'";
  • 请注意带有 target_table$YYYYMMMDD 后缀。这表明 YYYYMMDD对应的分区要被覆盖 按查询结果。
  • 请确保独特地 select 查询中的字段(这是一种良好做法)以避免出现意外情况。例如,select field1, field2, field3 from tableselect * from table.
  • 更明确和可读