我们有一组Google BigQuery表,出于技术原因,所有这些表都用通配符来区分,例如content_owner_asset_metadata_*
。这些表每天更新,但时间不同。
我们需要从通配符的每个表中选择最新的分区。
现在,我们正在使用此查询来构建派生表:
SELECT
*
FROM
`project.content_owner_asset_metadata_*`
WHERE
_PARTITIONTIME = (
SELECT
MIN(time)
FROM (
SELECT
MAX(_PARTITIONTIME) as time
FROM
`project.content_owner_asset_metadata_*`
WHERE
_PARTITIONTIME > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
)
)
此语句找出所有最新表的保证日期,并选择该日期的数据,但是我需要一个过滤器,该过滤器从每个表的最大分区时间中选择数据。我知道我需要将_TABLE_SUFFIX
与_PARTITIONTIME
结合使用,但是无法完全不花力气地完成选择工作,而不仅仅是加载所有数据(非常昂贵)并使用标准的每组最大n 。
我们不能仅合并一堆静态表,因为我们的数据集摄取可能会发生变化,并且我们构建的脚本需要能够适应。
使用BigQuery scripting(现在是Beta版),有一种方法可以修剪分区。
基本上,已定义脚本变量以捕获子查询的动态部分。然后,在随后的查询中,脚本变量用作筛选器以修剪要扫描的分区。
下面的示例使用BigQuery公共数据集来演示如何修剪分区以仅查询和扫描最新数据。
DECLARE max_date TIMESTAMP
DEFAULT (SELECT MAX(_PARTITIONTIME) FROM `bigquery-public-data.sec_quarterly_financials.numbers`);
SELECT * FROM `bigquery-public-data.sec_quarterly_financials.numbers`
WHERE _PARTITIONTIME = max_date;