将 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 table
比 select * from table
. 更明确和可读
我正在尝试更新 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 table
比select * from table
. 更明确和可读