如何在 BigQuery 中构建模块化查询?
Posted
技术标签:
【中文标题】如何在 BigQuery 中构建模块化查询?【英文标题】:How to build modular queries in BigQuery? 【发布时间】:2020-07-18 06:36:36 【问题描述】:我有一些有用的查询,我想构建一些需要它们作为子查询的更复杂的查询。我可以直呼他们的名字吗?
-
我看到了“保存视图”选项,并且能够构建使用保存视图的新查询。
此方法是否会在每次顶部查询使用它时通过重新执行相关查询来刷新保存的视图?还是只是一个命名的查询结果,我每次都必须重新运行才能刷新?
-
以模块化方式构建查询的其他建议?例如,当我更改我选择的天数范围时,我希望所有子查询都使用该范围。
在编程中,它要么使用发起人,要么使用全局变量,如何在 BigQuery 中做到这一点?
【问题讨论】:
【参考方案1】:虽然由于其广泛性,很难解决您的问题。对于每个疑问,我都会用一般准则和示例来回答他们。
关于您的第一个问题,关于子查询和通过别名调用查询。我对这些有两个考虑:
1) 您可以使用带有WITH 的子查询。因此,您可以在数据中执行转换,将其保存在临时表中并在下面引用它(子)查询。此外,每次运行代码时,都会执行所有查询。下面是一个例子,
WITH data as (
SELECT "Alice" AS name, 39 AS age, "San Francisco" AS city UNION ALL
SELECT "Marry" AS name, 35 AS age, "San Francisco" AS city UNION ALL
SELECT "Phill" AS name, 18 AS age, "Boston" AS city UNION ALL
SELECT "Robert" AS name, 10 AS age, "Tampa" AS city
),
greater_30 AS (
SELECT * FROM data
WHERE age > 30
),
SF_30 AS (
SELECT * FROM greater_30
WHERE city = "San Francisco"
)
SELECT * FROM SF_30
和输出,
Row name age city
1 Alice 39 San Francisco
2 Marry 35 San Francisco
2) 创建Stored Procedure: 过程是语句块,可以从其他查询中调用,也可以递归执行(在另一个过程中调用一个过程)。为了创建和存储过程,您必须指定将保存它的项目和数据集。还有,它的名字。下面是一个示例(使用 BigQuery 公共数据集),
#creating the procedure
CREATE or replace PROCEDURE project_id.ataset.chicago_taxi(IN trip_sec INT64, IN price INT64)
BEGIN
CREATE TEMP TABLE taxi_rides AS
SELECT * FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`
WHERE trip_seconds > trip_sec and fare >price
LIMIT 10000
;
END;
现在,您可以使用CALL 调用该过程。如下:
DECLARE trip_sec INT64 DEFAULT 30;
DECLARE price INT64 DEFAULT 30;
CALL `project_id.ataset.chicago_taxi`(trip_sec, price);
SELECT max(fare) AS max_fare,payment_type FROM taxi_rides
GROUP BY payment_type
还有输出,
Row max_fare payment_type
1 463.45 Cash
2 200.65 Credit Card
请注意,该过程保存在数据集中。然后我们使用 CALL 调用它并在下一个 select 语句中使用它的输出(temporary table)。我必须指出,每次调用该过程时,它都会执行查询。
关于您关于已保存视图的问题:视图会在您每次运行时更新。请参考documentation。
最后,关于在查询中使用参数和全局变量的最后一个问题:您可以在 BigQuery 中使用 scripting 以将 DECLARE 和 SET 一个变量。因此,您可以在更改过滤器参数时利用这些优势。下面是一个使用公共公共数据集的使用示例,
DECLARE time_s timestamp;
SET time_s= timestamp(DATETIME "2016-01-01 15:30:00");
SELECT * FROM `bigquery-public-data.chicago_taxi_trips.taxi_trips`
WHERE trip_start_timestamp > time_s
LIMIT 10000
注意,每次需要更改过滤器时,都可以从 SET 语句中进行。
注意:如果您有任何具体问题,请打开另一个线程,或者您可以在评论部分询问我。
【讨论】:
以上是关于如何在 BigQuery 中构建模块化查询?的主要内容,如果未能解决你的问题,请参考以下文章