首页 文章

BigQuery有效查询最新表

提问于
浏览
4

我正在尝试从数据集中的最新表中有效地查询,该数据集由 project_id:dataset:dataset_20160101project_id:dataset:dataset_20160102 等表格组成 .

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

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

但是,此查询要求我访问数据集中的所有表,而不仅仅是最新的表 . 这是为什么?

2 回答

  • 0

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

    在查询执行期间可以修剪表 . 启动查询,执行子查询,修剪表和读取数据 . 但它还没有ETA .

  • 0

    现在,如果你有一个插入表的管道,那么在管道的末尾你可以(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是预先计算的,因此它是常量 . 正如华解释的那样,您只需要处理最新的表格 .

相关问题