是否可以使用“$”装饰器访问标准 SQL 中的 BigQuery 分区?

Posted

技术标签:

【中文标题】是否可以使用“$”装饰器访问标准 SQL 中的 BigQuery 分区?【英文标题】:Is it possible to access a BigQuery partition in Standard SQL using the '$' decorator? 【发布时间】:2016-11-16 17:31:09 【问题描述】:

在 Google BigQuery 中,我在使用标准 SQL 查询分区表时尝试使用 $ 装饰器。我认为这应该允许我像在 Legacy SQL 中那样访问分区和表元数据,但它似乎不适用于标准 SQL。

以下两个查询都返回Error: Table "dataset.partitioned_table$___" cannot include decorator

1) 直接访问分区:

#StandardSQL
SELECT a, b, c
FROM `mydataset.partitioned_table$20161115`

2) 访问表元数据:

#StandardSQL
SELECT partition_id
FROM `mydataset.partitioned_table$__PARTITIONS_SUMMARY__`;

第一个查询的明显解决方法是使用_PARTITIONTIME 伪列:

#StandardSQL
SELECT a, b, c
FROM mydataset.partitioned_table
WHERE _PARTITIONTIME = '2016-11-15'

但是,我无法找到第二个查询的解决方法,这对于检索最新分区很有用(尽管使用该信息实际查询最新分区似乎也已损坏。请参阅:How to choose the latest partition in BigQuery table? )

【问题讨论】:

我们利用这个特性来研究流缓冲区中的记录,因为我们的一些进程依赖于它。我们最近实施了一个启用了集群和按小时分区的 BigQuery 表。这扩大了流缓冲区,但我们能够更新其中的记录。这导致在 LegacySQL 中使用 $__UNPARTITIONED 装饰器的查询不再有效的结论。我们已要求谷歌修复它。请也这样做。 【参考方案1】:

StandardSQL 目前不支持使用装饰器获取分区摘要。我们正在计划在这方面开展一些工作,但我们目前没有关于何时可用的 ETA。目前最快的选择是使用旧版 SQL 在 T$__PARTITIONS_SUMMARY__ 上运行查询。

【讨论】:

标准 SQL 中是否支持直接使用装饰器访问分区?该查询由 BQ 查询验证器验证,但运行它会产生错误。 目前,我们没有任何计划让标准 SQL 支持带有分区的装饰器语法来访问一个分区。但是,使用 _PARTITIONTIME = TIMESTAMP("2016-11-15") 等谓词具有完全相同的行为。我们将以更通用的方式处理__PARTITIONS_SUMMARY__,很可能无需使用装饰器语法。 是否支持使用子查询过滤_PARTITIONTIME?现在,你可以这样做,但是查询将跨所有分区处理整个表,而不仅仅是匹配where 条件的分区,这显然不理想。 我们计划添加对使用子查询进行分区时间过滤的支持,但目前我们还没有 ETA。谢谢。 @PavanEdara 对此有何更新?有进展吗?

以上是关于是否可以使用“$”装饰器访问标准 SQL 中的 BigQuery 分区?的主要内容,如果未能解决你的问题,请参考以下文章

python之函数:二

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

代码缺乏装饰?使用ts装饰器来装饰你的代码

实例方法的装饰器可以访问该类吗?