查询 BigQuery 数据集中的最新表

Posted

技术标签:

【中文标题】查询 BigQuery 数据集中的最新表【英文标题】:Query latest table in the BigQuery dataset 【发布时间】:2014-09-04 22:38:56 【问题描述】:

我有一个数据集,其中包含以 yyyymmdd 结尾的相似表名的表。例如:

myproject:mydataset.Sales20140815
myproject:mydataset.Sales20140816
myproject:mydataset.Sales20140817
myproject:mydataset.Sales20140818
...
myproject:mydataset.Sales20140903
myproject:mydataset.Sales20140904 

有没有办法编写 BigQuery 来查询数据集中的最新表(对于上面的示例,它是 myproject:mydataset.Sales20140904 )?

【问题讨论】:

【参考方案1】:

N.N.答案很好,但是如果重新导入一组旧数据,这些数据会被错误地拉​​为“最新”,则依赖修改日期是有问题的,因为 table_id 以正确的顺序明确列出日期,最好直接使用该值。

SELECT 
  *
FROM 
TABLE_QUERY(MyDATASET, 
      'table_id CONTAINS "MyTable" 
      AND table_id= (Select MAX(table_id) 
                              FROM MyDATASET.__TABLES__
                              where table_id contains "MyTable")'
            )

【讨论】:

table_id = (select max(..) ) 总是会满足条件table_id contains "MyTable" 所以不需要第一部分【参考方案2】:

如果你必须使用标准方言(这是 BQ 团队强烈推荐的),应该是这样的

#standardSQL
select * from `myproject:mydataset.*`
where _TABLE_SUFFIX = (select max(_TABLE_SUFFIX) from `myproject:mydataset.*`)

这样做的一个好处是您还可以在结果中公开您查询的表名

#standardSQL
select _TABLE_SUFFIX source, t.* from `myproject:mydataset.*` t
where _TABLE_SUFFIX = (select max(_TABLE_SUFFIX) from `myproject:mydataset.*`) 

【讨论】:

【参考方案3】:

我会使用表通配符功能。 如果最新的是今天的表,请使用

Select * from TABLE_DATE_RANGE(MyDATASET.PREFIX, Current_Timestamp(), Current_Timestamp())

如果上次更改的表格可能是过去的日期。你可以使用:

    SELECT 
      *
    FROM 
    TABLE_QUERY(MyDATASET, 
          'table_id CONTAINS "MyTable" 
          AND last_modified_time= (Select MAX(last_modified_time) 
                                  FROM MyDATASET.__TABLES__
                                  where table_id contains "MyTable")'
                )

希望这会有所帮助...

【讨论】:

【参考方案4】:
SELECT * 
FROM TABLE_QUERY(myproject:mydataset,
  "table_id IN (
     SELECT table_id FROM myproject:mydataset.__TABLES__  
     WHERE REGEXP_MATCH(table_id, r"^Sales.*")
     ORDER BY creation_time DESC LIMIT 1)")

【讨论】:

【参考方案5】:

我能想到的唯一解决方案涉及修改您的日常 ETL:

答:更新您的 ETL 以在最新表加载或更新后创建其副本。如果您使用的是 bq 命令行工具,则类似于:

bq cp mydataset.Sales20140904 mydataset.SalesLatestDay

然后您只需查询 SalesLatestDay 表。

B:更好的是,创建一个引用您最近的表(“SELECT * FROM mydataset.Sales20140904”)的视图,并每天更新它。有关使用 REST API 创建视图的信息: https://developers.google.com/bigquery/docs/reference/v2/tables#resource

【讨论】:

【参考方案6】:

如果您的表肯定每天都更新,这是我的窍门。

SELECT * FROM TABLE_DATE_RANGE(myproject:mydataset.Sales, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP())

【讨论】:

以上是关于查询 BigQuery 数据集中的最新表的主要内容,如果未能解决你的问题,请参考以下文章

可以在 BigQuery 中从不同数据集中查询表

BigQuery:使用标准 SQL 查询多个数据集和表

在 bigquery 上查询项目中的所有数据集和表?

将数据导入 Bigquery,但只能通过作业历史访问“表”,无法在数据集中查看

使用 python 和 BigQuery API 获取 BigQuery 数据集中的表列表

如何使用 dplyr 和 bigquery 从 Bigquery 数据集中的多个表中进行选择?