将 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 摄取数据(批量)?