有没有一种简单的方法可以根据 BigQuery 中的时区差异生成 table_query?

Posted

技术标签:

【中文标题】有没有一种简单的方法可以根据 BigQuery 中的时区差异生成 table_query?【英文标题】:is there an easy way to generate a table_query based off of a timezone difference in BigQuery? 【发布时间】:2016-08-11 15:53:21 【问题描述】:

旧版 SQL

我正在使用 GBQ 的旧版 SQL 通过 TABLE_QUERY 函数动态查询表。我根据CURRENT_TIMESTAMP动态生成要查询的表名。例如,我从按季度分区的表中(即 mydataset.hit_data_[1-4])中过去 14 天的命中数据中选择设备。

标准 SQL

我需要将时区转换为 PST。 GBQ 标准 SQL 有TIME ZONE 转换。切换到标准 SQL,我可以使用 GBQ 标准 SQL 转换时区。但是,如果我现在尝试在同一个查询中使用 TABLE_QUERY 来执行我在 Legacy SQL 版本中所做的事情,我会得到:

Error: Table-valued functions are not supported

同时使用

有没有办法两全其美?如果前 14 天与 Q3 重叠,我想根据 Q4 的当前时间戳查询 mydataset.hit_data_3 和 mydataset.hit_data_4。

SELECT device FROM TABLE_QUERY(mydataset, 'table_id = CONCAT(\"hit_data_\", STRING(QUARTER(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles")))) OR table_id = CONCAT(\"hit_data_\", STRING(QUARTER(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles"), INTERVAL -14 DAY)))) ') WHERE DATE(date_time) BETWEEN DATE(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, 'America/Los_Angeles'), INTERVAL -14 DAY)) AND DATE(CURRENT_DATE()) ;

看起来很丑,但在GBQ中应该是有效的。

【问题讨论】:

【参考方案1】:

标准 SQL 不支持 TABLE_QUERY 或 TABLE_DATE_RANGE 函数。相反,它支持带有特殊伪列 _TABLE_SUFFIX 的通配符表:

您应该能够在 _TABLE_SUFFIX 伪列上使用 WHERE 子句重写您的查询

https://cloud.google.com/bigquery/docs/querying-wildcard-tables

【讨论】:

谢谢,帕万。有没有关于这是否会支持某一天的观点的消息? 您能简单介绍一下以这种方式查询多个视图的用例吗?您能否定义一个通过在视图定义本身内部使用 _TABLE_SUFFIX 上的过滤器来实现此目的的单个视图? 我认为我们可以定义一个使用 _TABLE_SUFFIX 的单个视图,但目前我们表的命名约定将 _v 附加到原始 table_name。所以 _TABLE_SUFFIX 匹配表名* 会无意中匹配所有视图并报错。【参考方案2】:

对于 BigQuery 标准 SQL,您应该使用 _TABLE_SUFFIX 伪列,该列允许您选择要从中查询的表

下面是前进的方向

SELECT * 
FROM `mydataset.hit_data_*` 
WHERE (_TABLE_SUFFIX = STRING(QUARTER(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles")))
OR _TABLE_SUFFIX = STRING(QUARTER(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, "America/Los_Angeles"), INTERVAL -14 DAY)))
)
AND DATE(date_time) BETWEEN 
      DATE(DATE_ADD(TIMESTAMP(CURRENT_TIMESTAMP, 'America/Los_Angeles'), INTERVAL -14 DAY)) 
    AND DATE(CURRENT_DATE())

注意:您需要确保您使用的是标准 SQL 支持的函数 例如,而不是

QUARTER(TIMESTAMP(...))   

你应该使用

EXTRACT(QUARTER FROM TIMESTAMP(...))

【讨论】:

以上是关于有没有一种简单的方法可以根据 BigQuery 中的时区差异生成 table_query?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁止向BigQuery加载重复的行?

有没有办法根据 Bigquery 查询中的标签选择表?

大查询 UDF 支持

检查 Airflow 中是不是存在 Bigquery 分区

Bigquery:是不是有一种 json 路径方法可以仅从具有动态键的 json 数组中提取值?

将 csv 数据发布/订阅到 Dataflow 到 BigQuery