在 BigQuery 中使用 TABLE_DATE_RANGE 函数
Posted
技术标签:
【中文标题】在 BigQuery 中使用 TABLE_DATE_RANGE 函数【英文标题】:Using the TABLE_DATE_RANGE function in BigQuery 【发布时间】:2017-11-30 23:33:16 【问题描述】:我在很长一段时间内第一次使用 BigQuery,所以我有点生疏了。
我使用的公共数据集可以是found here for Reddit data.
这是一个快照:
我要做的是创建一个查询,提取 2017 年的所有数据。
基本上,我想使用与此等效的 BQ 语法,它是使用标准 SQL 编写的:
fh-bigquery.reddit_posts.2017*
我知道这将涉及使用 TABLE_DATA_RANGE 函数,但我对它的具体措辞感到困惑。
如果我只使用其中一张表,它会如下所示:
SELECT
FORMAT_UTC_USEC(SEC_TO_TIMESTAMP(created_utc)) AS created_date
FROM
[fh-bigquery:reddit_posts.2017_06]
LIMIT
10
但我显然试图跨越几个月。
【问题讨论】:
fh-bigquery.reddit_posts.2017*
有什么问题?使用标准 SQL(不是使用旧版 SQL 的 TABLE_DATE_RANGE)。
因为我想用 BQ 语法来熟悉它。
【参考方案1】:
以下是 BigQuery 标准 SQL
#standardSQL
SELECT
TIMESTAMP_SECONDS(created_utc) AS created_date
FROM `fh-bigquery.reddit_posts.2017_*`
LIMIT 10
它完成了您对一个表的查询 - 但对于 2017 年的所有表(不确定您在查询中寻找的实际逻辑是什么 - 但为了简单起见,我希望您将其留在问题之外)
注意:您可以在查询中使用_TABLE_SUFFIX
来确定具体表的具体行来自哪个确切的行——例如:
#standardSQL
SELECT
_TABLE_SUFFIX AS month,
COUNT(1) AS records
FROM `fh-bigquery.reddit_posts.2017_*`
GROUP BY month
ORDER BY month
输出如下
month records
----- ---------
01 9,218,513
02 8,588,120
03 9,616,340
04 9,211,051
05 9,498,553
06 9,597,725
07 9,989,122
08 10,424,133
09 9,787,604
10 10,281,718
如果由于某种原因您仍然绑定到 BigQuery Legacy SQL - 您可以在下面使用
#legacySQL
SELECT
FORMAT_UTC_USEC(SEC_TO_TIMESTAMP(created_utc)) AS created_date
FROM TABLE_QUERY([fh-bigquery:reddit_posts], "LEFT(table_id, 5) = '2017_'")
LIMIT 10
但强烈推荐migrate to Standard SQL
【讨论】:
不应该是..2017*
而不是..2017_*
来捕捉边缘情况,例如201708_
?
我故意将2017_
放在我认为201708_
和201707_
是其中包含零行的异常值。
@MikhailBerlyant 谢谢你,但同样,我正在寻找 BQ 特定的语法。我已经知道标准 SQL。
请再次阅读答案。它提供了两个选项 - 都适用于 BigQuery - 一个适用于标准 SQL,另一个适用于旧版 SQL!这不是你问的吗?
"我正在寻找 BQ 特定的语法" 为什么要学习旧的 SQL 语法?它被称为“遗留”,因为它不是首选的 SQL 方言。以上是关于在 BigQuery 中使用 TABLE_DATE_RANGE 函数的主要内容,如果未能解决你的问题,请参考以下文章
在 Power BI 中使用 BigQuery 重复/嵌套字段
是否可以在 aws lambda 中使用 bigquery?
BigQuery -- 在公开共享项目中使用 UDF 的问题