繁体   English   中英

Python - 将 Python 变量用于 BigQuery Magic 查询结构(不是查询参数)

[英]Python - Use Python variable for BigQuery Magic query structure (not query parameter)

我想使用 Python 变量来帮助构建 BigQuery Magic SQL 查询的结构,但是我无法确定这样做的方法。 不是WHERE子句或类似内容的参数——它是查询本身的结构。

这是我想使用 Python 变量day_of_week的 BigQuery Magic:

%%bigquery df
SELECT DATE_DIFF(CURRENT_DATE(), opening_date, WEEK(WEDNESDAY)) AS diff_weeks #I want to change WEDNESDAY to day_of_week

我尝试执行以下操作:

params = {"day_of_week": day_of_week} #day_of_week could be either MONDAY, TUESDAY, WEDNESDAY etc.

%%bigquery df --params $params
SELECT DATE_DIFF(CURRENT_DATE(), opening_date, WEEK(@day_of_week)) as diff_weeks

但是,BigQuery Magic 似乎将其视为值参数, 'WEDNESDAY'而不是WEDNESDAY

有任何想法吗?

我想出了另一种方法来做我想做的事情,它保留了 BigQuery Magic 的使用。

根据我的研究,BigQuery Magic 似乎不允许动态查询,您可以在其中使用 Python 变量作为查询结构。 如果你想这样做,你必须使用 BigQuery Python Client 库并将查询创建为字符串,这不是很容易调试。

因此,我找到了一种在 BigQuery SQL 中执行DATE_DIFF(end_date, start_date, WEEK(<WEEKDAY>))的替代方法,它允许我使用 Python 变量动态交换<WEEKDAY>参数。

params = {"day_of_week": day_of_week} #day_of_week could be Monday, Tuesday, Wednesday, etc.

%%bigquery df --params $params

SELECT COUNT(*) counts
FROM (SELECT DATE FROM UNNEST(GENERATE_DATE_ARRAY(start_date, end_date)) AS DATE)
WHERE FORMAT_DATE('%A', DATE) = @day_of_week #this is the Python variable
GROUP BY FORMAT_DATE('%A', DATE)

此 SQL 语句使用提供的start_dateend_date之间的GENERATE_DATE_ARRAY创建日期数组。 FORMAT_DATE('%A', DATE)将每个日期转换为工作日(即星期一、星期二、星期三等)。 并且有效地,通过执行GROUP BY FORMAT_DATE('%A', DATE)COUNT(*) ,它计算每个工作日的出现次数。

执行WHERE FORMAT_DATE('%A', DATE) = @day_of_week然后将其过滤到您关心的工作日。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM