我可以一次替换 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 分区表的分区间隔吗?的主要内容,如果未能解决你的问题,请参考以下文章
Google Bigquery:Spark - 不兼容的表分区规范