将 BigQuery SQL 与内置 Python 函数结合使用

Posted

技术标签:

【中文标题】将 BigQuery SQL 与内置 Python 函数结合使用【英文标题】:Using BigQuery SQL with Built-in Python Functions 【发布时间】:2018-11-25 16:52:43 【问题描述】:

我最近开始使用 Google 的 BigQuery 服务和他们的 Python API 来查询一些大型数据库。我是 SQL 新手,BigQuery 文档对我正在做的事情并没有太大帮助。

目前我正在查看 reddit_cmets 数据库,并且我正在尝试过滤“created_utc”标签。这个 created_utc 字段是 Unix 时间戳(即 11 月 1 日凌晨 12:00 是 1541030400)

我想每天(或在两个 Unix 时间戳之间)获取 cmets,但我每天都在迭代。比如:

from datetime import datetime, timedelta


start = datetime.fromtimestamp(1538352000)
end = datetime.fromtimestamp(1541030400)

time = start

while time < end:
    print(time)
    time = time + timedelta(days = 1)

这里的打印时间会产生类似:2018-09-30 20:00:00 但是为了查询,我必须通过调用 datetime 的 timestamp() 函数(如 time.timestamp() )转换回 Unix 时间戳

问题是,我试图在查询中使用 timestamp() 函数,如下所示:

SELECT *
FROM 'fh-bigquery.reddit_comments.2018_10'
...
AND (created_utc >= curr_day.timestamp() AND created_utc <= next_day.timestamp())

但是,它抛出了一个 BadRequest: 400 Function not found。有没有办法按照我上面描述的方式使用内置的 Python 函数?还是需要一些替代方案?

到目前为止,一切看起来都很直观,但奇怪的是我找不到太多有用的信息。

【问题讨论】:

为了比较,你不能随意混合Java和Python——它们是不同的编程语言。这也适用于 SQL 和 Python。 【参考方案1】:

您应该使用 BigQuery 的 Built-in functions

例如:

获取当前时间戳 - CURRENT_TIMESTAMP() 获取当前日期开始的时间戳 - TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), DAY) 获取下一个日期开始的时间戳 - TIMESTAMP_TRUNC(TIMESTAMP_ADD(CURRENT_TIMESTAMP() , INTERVAL 1 DAY), DAY)

等等

另外,要将 created_utc 转换为 TIMESTAMP 类型 - 您可以使用 TIMESTAMP_SECONDS(created_utc)

你可以看到更多关于TIMESTAMP Functions

【讨论】:

感谢您的回复。此外,是否可以在查询中使用用户声明的变量?我也没有看到任何简单的方法。 见Running Parameterized Queries

以上是关于将 BigQuery SQL 与内置 Python 函数结合使用的主要内容,如果未能解决你的问题,请参考以下文章

无法在 python 中对 bigquery 运行标准 SQL 查询

是否使用数据流管道(未内置自定义)从谷歌存储到 bigquery 摄取数据(批量)?

将 SQL 源文件与 bigquery cli 一起使用

将 BigQuery 的聚合具体化转储到 SQL 服务器、Dataflow 与 Airflow

如何使用 SQL 将重复数据插入 BigQuery 表

将常规函数与 WINDOW 函数结合使用的 Google BigQuery SQL 问题