查询BigQuery数据集中的最新表

时间:2014-09-04 22:38:56

标签: google-bigquery

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

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

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

6 个答案:

答案 0 :(得分:8)

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")'
            )

答案 1 :(得分:2)

只有我能想到的解决方案涉及对您的日常ETL的修改:

A:更新您的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

答案 2 :(得分:2)

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

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")'
                )

希望这会有所帮助......

答案 3 :(得分:2)

sample code here:
http://codepen.io/2fdevs/pen/KmDIE

答案 4 :(得分:1)

如果你必须使用标准方言(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.*`) 

答案 5 :(得分:0)

如果你的桌子每天都在更新,这是我的诀窍。

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