使用 _PARTITIONTIME 从现有 table 在 BigQuery 中创建集群 table
Create a clustered table in BigQuery from existing table with _PARTITIONTIME
我正在尝试创建一个新的集群 table、db.new_table
,它与 BigQuery 中的现有 table、db.old_table
具有相同的数据和架构。现有的 table 有一个伪列 _PARTITIONTIME
,我希望新的 table 也有这个 _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
所述
有没有办法做到这一点? (创建一个新的集群 table,其模式和数据来自旧的 table,由伪列 _PARTITIONTIME 分区)
感谢任何回答和评论,谢谢。
备注:
我可以创建一个类似的 table 不带 _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
的变化会导致很多查询变化...因此如果我们可以用完全相同的模式和数据创建集群 table 就更好了。
您可以使用 BQ UI 或 bq
命令预先创建名为 db.new_table
的按天划分的集群 table(在任何字段上)。
table 出现后,您可以将 "for each day" 填充为:
bq query --allow_large_results --append_table --noflatten_results --destination_table 'db.new_table900101' "select field1, field2, field3 from db.old_table where _PARTITIONTIME = '1990-01-01'";
注意两件事:
- 您必须每天分别 运行 此查询(费用几乎相同,所以不用担心)。
db.new_table900101
指向db.new_table
中1990-01-01
的分区。
我正在尝试创建一个新的集群 table、db.new_table
,它与 BigQuery 中的现有 table、db.old_table
具有相同的数据和架构。现有的 table 有一个伪列 _PARTITIONTIME
,我希望新的 table 也有这个 _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
有没有办法做到这一点? (创建一个新的集群 table,其模式和数据来自旧的 table,由伪列 _PARTITIONTIME 分区)
感谢任何回答和评论,谢谢。
备注: 我可以创建一个类似的 table 不带 _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
的变化会导致很多查询变化...因此如果我们可以用完全相同的模式和数据创建集群 table 就更好了。
您可以使用 BQ UI 或 bq
命令预先创建名为 db.new_table
的按天划分的集群 table(在任何字段上)。
table 出现后,您可以将 "for each day" 填充为:
bq query --allow_large_results --append_table --noflatten_results --destination_table 'db.new_table900101' "select field1, field2, field3 from db.old_table where _PARTITIONTIME = '1990-01-01'";
注意两件事:
- 您必须每天分别 运行 此查询(费用几乎相同,所以不用担心)。
db.new_table900101
指向db.new_table
中1990-01-01
的分区。