Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google bigquery 我可以一次替换BigQuery分区表的分区间隔吗?_Google Bigquery - Fatal编程技术网

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

Google bigquery 我可以一次替换BigQuery分区表的分区间隔吗?,google-bigquery,Google Bigquery,我正在使用pythonsdk处理BigQuery表,我想实现一些看起来可行的东西,但在文档中找不到任何东西 我有一个按日期划分的表T,还有一个SELECT请求,它计算过去X天的值。在T中,我想用这些值替换最后X天的分区,而不影响早于X天的分区 以下是我们仅更换一个分区的方法: job_config = bigquery.QueryJobConfig() job_config.destination = dataset.table("{}${}".format(table, date.strfti

我正在使用pythonsdk处理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天的分区

有没有一种方法可以轻松做到这一点?或者我必须循环间隔的每个分区吗


谢谢

我不认为你可以通过玩目的地表来实现它

不考虑成本,使用SQL可以做的是

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

成本

第一次删除将:

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


第二次插入的成本应与您当前的查询相同。

谢谢,如果我理解正确,与循环并替换每个分区相比,由于删除部分的原因,这将花费更多的成本,或者由于我们使用write_truncate支付删除成本,这是一样的?write_truncate应该是一个仅元数据的操作,它没有“删除”的成本(双引号,因为没有真正被删除的内容,只有元数据指向新数据)
INSERT INTO your_ds.your_table SELECT (...)