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