【问题标题】:Bigquery Select all latest partitions from a wildcard set of tablesBigquery 从一组通配符表中选择所有最新的分区
【发布时间】:2019-09-22 03:02:28
【问题描述】:

我们有一组 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 解决方案,我无法完全弄清楚如何使选择工作.

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

【问题讨论】:

  • 这是我通常会以编程方式构建查询的地方。你有几张桌子?如果您从他们那里获取数据,对于他们最近各自的日期分区,会很好吗?
  • 我们有大约 40 个表,每个表有近 700 个分区。我们想要查询每个表的最新分区,而不是每个表中的其他 699 个分区。最终目标是构建一个查看器派生表(基本上是一个视图),其中包含每个表中的最新数据。

标签: sql google-bigquery greatest-n-per-group


【解决方案1】:

使用 BigQuery scripting(现在是测试版),有一种方法可以修剪分区。

基本上,脚本变量被定义为捕获子查询的动态部分。然后在后续查询中,脚本变量用作过滤器来修剪要扫描的分区。

以下示例使用 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多