使用require_partition_filter

时间:2019-04-15 13:30:13

标签: google-bigquery

我正在尝试找到一种方法来列出用require_partition_filter = true创建的表的分区,但是我还无法找到方法。

这是表创建脚本

CREATE TABLE mydataset.partitionedtable_partitiontime
(
x INT64 \
)
PARTITION BY DATE(_PARTITIONTIME)
OPTIONS(
require_partition_filter = true
);

一些测试行

INSERT INTO mydataset.partitionedtable_partitiontime (_PARTITIONTIME, x) SELECT TIMESTAMP("2017-05-01"), 10;
INSERT INTO mydataset.partitionedtable_partitiontime (_PARTITIONTIME, x) SELECT TIMESTAMP("2017-04-01"), 20;
INSERT INTO mydataset.partitionedtable_partitiontime (_PARTITIONTIME, x) SELECT TIMESTAMP("2017-03-01"), 30;

如预期的那样,如果尝试通过以下查询获取分区,则会收到错误消息,因为我需要在分区列顶部使用过滤器

SELECT _PARTITIONTIME as pt, FORMAT_TIMESTAMP("%Y%m%d", _PARTITIONTIME) as partition_id
FROM `mydataset.partitionedtable_partitiontime`
GROUP BY _PARTITIONTIME
ORDER BY _PARTITIONTIME

错误

Cannot query over table 'mydataset.partitionedtable_partitiontime' without a filter over column(s) '_PARTITION_LOAD_TIME', '_PARTITIONDATE', '_PARTITIONTIME' that can be used for partition elimination

任何想法如何列出分区?

编辑:我知道可以添加过滤器,但是我正在寻找Hive的“ SHOW PARTITIONS TABLENAME”之类的解决方案来列出所有分区(本质上是元数据)

谢谢!

2 个答案:

答案 0 :(得分:2)

这是操作方法

SELECT * FROM `mydataset.partitionedtable_partitiontime$__PARTITIONS_SUMMARY__`

需要bigquery.jobs.create权限

答案 1 :(得分:0)

hlagos所述,如果您使用的是 Standard SQL _PARTITIONTIME,则可以通过查询__PARTITIONS_SUMMARY__伪列来获取此数据。 旧版SQL 的元表。

您可以查看this GCP documentation,其中包含有关此分区表元数据的用法的详细信息。