使用 _PARTITIONTIME 从现有表在 BigQuery 中创建聚簇表

Posted

技术标签:

【中文标题】使用 _PARTITIONTIME 从现有表在 BigQuery 中创建聚簇表【英文标题】:Create a clustered table in BigQuery from existing table with _PARTITIONTIME 【发布时间】:2018-11-15 09:15:59 【问题描述】:

我正在尝试创建一个新的聚集表 db.new_table,它与 BigQuery 中的现有表 db.old_table 具有相同的数据和架构。现有表有一个伪列_PARTITIONTIME,我希望新表也有这个_PARTITIONTIME 伪列。

我尝试过使用 DDL,查询如下:

CREATE TABLE `db.new_table`
PARTITION BY DATE(_PARTITIONTIME)
CLUSTER BY field1, field2
AS SELECT * FROM `db.old_table`
WHERE _PARTITIONTIME > '1990-01-01'

但是它失败了,因为我们不能使用PARTITION BY DATE(_PARTITIONTIME) 后跟AS SELECT ...。如https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language中所述

有没有办法做到这一点? (从由伪列 _PARTITIONTIME 分区的旧表中创建一个具有完全相同架构和数据的新聚簇表)

感谢任何回答和评论。


注意事项: 我可以创建一个没有 _PARTITIONTIME 的类似表,查询如下:

CREATE TABLE `db.new_table`
PARTITION BY partition_date
CLUSTER BY field1, field2
AS SELECT DATE(_PARTITIONTIME) AS partition_date, * FROM `db.old_table`
WHERE _PARTITIONTIME > '1990-01-01'

但是由于系统中很多东西都依赖于db.old_table,所以分区字段从_PARTITIONTIMEpartition_date的变化会导致很多查询变化......因此如果我们可以创建具有完全相同架构和数据的聚簇表。

【问题讨论】:

【参考方案1】:

您可以使用 BQ UI 或 bq 命令预先创建名为 db.new_table 的按天分区的聚簇表(在任何字段上)。

表格出现后,您可以将“每天”填充为:

bq query --allow_large_results --append_table --noflatten_results --destination_table 'db.new_table$19900101' "select field1, field2, field3 from db.old_table where _PARTITIONTIME = '1990-01-01'";

注意两点:

您必须每天单独运行此查询(这将花费您几乎相同的费用,所以不用担心)。 db.new_table$19900101指向1990-01-01db.new_table中的分区。

【讨论】:

以上是关于使用 _PARTITIONTIME 从现有表在 BigQuery 中创建聚簇表的主要内容,如果未能解决你的问题,请参考以下文章

Big Query 在从一个表插入到另一个表时指定 _PARTITIONTIME

在聚类时使用基于摄取时间的伪字段 (_PARTITIONTIME) 作为分区

BigQuery 分区表在 _PARTITIONTIME 加入

BigQuery 流式传输和分区:_PARTITIONTIME 何时真正评估?

Bigquery:按 _PARTITIONTIME 过滤不会在 LEFT JOIN 上传播

从日志表和参考表在 Big Query 中创建新表