Bigquery从通配符表集中选择所有最新分区

问题描述 投票:0回答:1

我们有一组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 。

我们不能仅合并一堆静态表,因为我们的数据集摄取可能会发生变化,并且我们构建的脚本需要能够适应。

sql google-bigquery greatest-n-per-group
1个回答
1
投票

使用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;

© www.soinside.com 2019 - 2024. All rights reserved.