【问题标题】:BigQuery Query Latest Table EfficientlyBigQuery 高效查询最新表
【发布时间】:2017-11-22 01:49:53
【问题描述】:

我正在尝试从由project_id:dataset:dataset_20160101project_id:dataset:dataset_20160102 等形式的表组成的数据集中的 latest 表中高效查询。

这个查询似乎是推荐的解决方案:

SELECT * 
FROM `project_id.dataset.*`
WHERE _TABLE_SUFFIX=(SELECT MAX(table_id) FROM `project_id.dataset.__TABLES_SUMMARY__`)

但是,这个查询让我访问数据集中的所有表,而不仅仅是最新的。这是为什么呢?

【问题讨论】:

  • 我有同样的问题,我认为这是谷歌方面的一个错误。当我比较使用 _TABLE_SUFFIX 的硬编码值运行查询时,执行时间相同。似乎正在处理相同的数量。

标签: google-bigquery


【解决方案1】:

当 WHERE 子句在伪列上使用常量表达式时,我们只能在查询运行之前修剪表,例如,_TABLE_SUFFIX = 'dataset_20160102'。对于您的查询,由于 WHERE 子句包含一个不解析为常量的子程序,因此我们无法在查询运行之前修剪表。相反,从所有表中读取数据并执行子查询。然后将数据与子查询结果连接并过滤。

可以在查询执行期间修剪表。启动查询,执行子查询,修剪表,读取数据。但目前还没有预计到达时间。

【讨论】:

    【解决方案2】:

    现在,如果您有一个插入表格的管道,那么在管道的末尾,您可以 (1) 获取 MAX(table_id) (2) 使用以下查询创建视图:

    SELECT
            *,
            DATE max_table_id AS _LATEST_DATE,
            PARSE_DATE('%E4Y%m%d', _TABLE_SUFFIX) AS _DATA_DATE
    FROM `project_id.dataset.*`
    

    然后,每当您想查询数据时,您可以只查询视图,并指定 _DATA_DATE=_LATEST_DATE 作为过滤器。在这种情况下,_LATEST_DATE 是预先计算的,因此它是常量。正如华解释的那样,您只需为处理最新的表格付费。

    【讨论】:

      猜你喜欢
      • 2017-12-23
      • 2016-10-19
      • 1970-01-01
      • 2016-04-04
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 2010-12-13
      相关资源
      最近更新 更多