【问题标题】:Using Google BigQuery to run multiple queries back to back使用 Google BigQuery 背靠背运行多个查询
【发布时间】:2017-07-21 07:45:30
【问题描述】:
我目前正在开展一个项目,我正在使用 Google Big Query 从电子表格中提取数据。我对 SQL 很陌生,所以我很抱歉。我目前正在使用以下代码
Select *
From my_data
Where T1 > 1000
And T2 > 2000
所以保持 Select 和 From 相同,我希望能够运行多个查询,我可以在 t1 和 t2 之间不断更改我正在寻找的值。大约 50 种不同的值。我希望 BigQuery 能够背靠背运行这 50 个不同的值。有没有办法做到这一点?谢谢!
【问题讨论】:
标签:
mysql
sql
google-bigquery
【解决方案1】:
我对 SQL 很陌生
...我假设 BigQuery 要么...,所以
以下是尚不熟悉BigQuery API 和/或different clients 而不是BigQuery Web UI 的新用户的选项之一。
BigQuery Mate 向 BigQuery 网页界面添加参数功能
你需要做的是
-
使用保存查询按钮将您的查询保存如下
通知<var_t1> 和<var_t2>
这些是 BigQuery Mate 可识别的参数
-
现在您可以设置这些参数
点击QB Mate,然后点击Parameters进入下面的表格
-
现在您可以使用任何想要运行的值来设置参数;
单击 Replace Parameters OK 按钮,这些值将出现在编辑器中。例如
点击OK后会得到
所以现在你可以运行你的查询了
- 要使用新参数运行另一轮,您需要通过单击 Edit Query 按钮
再次将保存的查询加载到编辑器中
现在重复设置参数等等
您可以找到 BigQuery Mate Chrome 扩展程序here
免责声明:我是该工具的作者和唯一的开发者
【解决方案2】:
您可能有兴趣运行parameterized queries。这个想法是有一个单一的查询字符串,例如:
SELECT *
FROM YourTable
WHERE t1 > @t1_min AND
t2 > @t2_min;
您将多次执行此操作,每次绑定 t1_min 和 t2_min 参数的不同值。确切的逻辑取决于您使用 client libraries 所通过的 API,并且在我提供的第一个链接中有特定于语言的示例。
【解决方案3】:
如果您不关心 sql-injection 并且只想迭代地换出查询中的参数,您可能需要研究 mustache 模板语言(在 R 中以“whisker”的形式提供)。
如果您使用 R,您可以使用 condusco R 包迭代/自动化此类查询。这是一个完整的 R 脚本,它将使用胡须和 condusco 完成这种迭代查询:
library(bigrquery)
library(condusco)
library(whisker)
# create a simple function that will create a query
# using {{{mustache}}} placeholders for any parameters
create_results_table <- function(params){
destination_table <- '{{{dataset_id}}}.{{{table_prefix}}}_results_{{{year_low}}}_{{{year_high}}}'
query <- '
SELECT *
FROM `bigquery-public-data.samples.gsod`
WHERE year > {{{year_low}}}
AND year <= {{{year_high}}}
'
# use whisker to swap out {{{mustache}}} placeholders with parameters
query_exec(
whisker.render(query,params),
project=whisker.render('{{{project}}}', params),
destination_table = whisker.render(destination_table,params),
use_legacy_sql = FALSE
)
}
# create an invocation query to provide sets of parameters to create_results_table
invocation_query <- '
SELECT
"<YOUR PROJECT HERE>" as project,
"<YOUR DATASET_ID HERE>" as dataset_id,
"<YOUR TABLE PREFIX HERE>" as table_prefix,
num as year_low,
num+1 as year_high
FROM `bigquery-public-data.common_us.num_999999`
WHERE num BETWEEN 1992 AND 1995
'
# call condusco's run_pipeline_gbq to iteratively run create_results_table over invocation_query's results
run_pipeline_gbq(
create_results_table,
invocation_query,
project = '<YOUR PROJECT HERE>',
use_legacy_sql = FALSE
)