使用_PARTITIONTIME

时间:2018-11-15 09:15:59

标签: google-bigquery ddl

我正在尝试制作一个新的集群表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,因此分区字段从_PARTITIONTIME更改为partition_date会引起很多查询更改...因此如果我们可以使用完全相同的架构和数据创建聚簇表,那就更好了。

1 个答案:

答案 0 :(得分:0)

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

表到位后,您可以将“每天”填充为:

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的分区。