我可以一次替换 BigQuery 分区表的分区间隔吗?

Posted

技术标签:

【中文标题】我可以一次替换 BigQuery 分区表的分区间隔吗?【英文标题】:Can I replace an interval of partitions of a BigQuery partitioned table at once? 【发布时间】:2019-10-21 15:47:49 【问题描述】:

我正在使用 Python SDK 处理 BigQuery 表,我想实现一些看起来可行但在文档中找不到的东西。

我有一个按日期分区的表 T,并且我有一个 SELECT 请求,该请求计算过去 X 天的值。在 T 中,我想用这些值替换最后 X 天的分区,而不影响早于 X 天的分区。

这是我们如何只更换一个分区:

job_config = bigquery.QueryJobConfig()
job_config.destination = dataset.table("$".format(table, date.strftime("%Y%m%d")))
job_config.use_legacy_sql = False
job_config.write_disposition = bigquery.job.WriteDisposition.WRITE_TRUNCATE

query_job = bigquery.job.QueryJob(str(uuid.uuid4()), query, client, job_config)
query_job.result()

我试着这样去:

 job_config.destination = dataset.table(table))

但它会截断所有分区,即使是那些早于 X 天的分区。

有没有办法轻松做到这一点?还是我必须遍历间隔的每个分区?

谢谢

【问题讨论】:

【参考方案1】:

我认为你不能通过玩目标表来实现它。

不考虑成本,用SQL能做什么

DELETE FROM your_ds.your_table WHERE partition_date > DATE_SUB(CURRENT_DATE(), INTERVAL X DAY);

然后

INSERT INTO your_ds.your_table SELECT (...)

费用

第一个DELETE将cost:

为查询扫描的表的所有分区中引用的所有列处理的字节总和 + 正在修改的表的已修改或扫描分区中所有列的字节总和(在 DELETE 开始时)。

第二个 INSERT INTO 的成本应该与您当前的查询相同。

【讨论】:

谢谢,如果我理解正确的话,与循环和替换每个分区相比,这会因为 DELETE 部分而花费更多,或者因为我们用 write_truncate 支付删除费用而同样的费用?跨度> write_truncate 应该是一个仅元数据的操作,它不需要“删除”(双引号,因为没有真正被删除,只有元数据指向新数据)

以上是关于我可以一次替换 BigQuery 分区表的分区间隔吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Data Studio 修剪 BigQuery 分区

BigQuery 中 Hive 的显示分区的替代方案

Google Bigquery:Spark - 不兼容的表分区规范

如何在 BigQuery UI 中插入覆盖分区表?

BigQuery 整数分区 - 我可以使用另一个查询的结果来获取要访问的分区列表吗?

是否可以覆盖 BigQuery 中的分区?