我正在寻找一种对Google BigQuery中的多个参数并行运行参数化查询的方法,这可能吗?
例如,我正在寻找可以运行以下查询的内容:
WITH generic_query AS (
SELECT EXTRACT(DATE FROM start_date) as date
, COUNT(0) as total
FROM multi_tennant_visit_table
WHERE start_date BETWEEN @startDate AND @endDate
AND company_id = @companyId
)
针对固定的@startDate
和@endDate
,但使用@companyId
值的某种数组,并以以下(JSON
)格式将数据作为结构化响应返回:< / p>
[
{
"company_id": "1",
"data": [
{
"date": "2019-01-01",
"total": "1431"
},
{
"date": "2019-01-02",
"total": "1876"
}
]
},
{
"company_id": "2",
"data": [
{
"date": "2019-01-01",
"total": "1431"
},
{
"date": "2019-01-02",
"total": "1876"
}
]
}
]
但是,由于company_id
是分层的,因此这过于简化了,因为表中的访问可能与一家公司及其母公司以及该公司的母公司等相关联,这些都在一个级别中处理结构未显示在这里。
此外,我想以这种方式运行大约20个查询,其中一些查询很简单,可以通过结束时使用的company_id
和ARRAY_AGG()
和STRUCT()
重新编写为分组与我正在寻找的响应格式有关,但是有些人根本无法使用,因为它们在几个嵌套的子查询中使用@companyId
,并且我需要保持对涉众的解释能力,即,这将运行我们查询在所有范围内都有,结果如下。
在bigquery(理想情况下是一种查询)中,有没有一种方法可以做到这一点,因为我正在查看1000个@company_id
值和几个GB /天的数据库,所以不想成本在不断攀升。
非常感谢,如果需要进一步澄清,请随时询问
更新:
我尝试将子查询转换为接受company
作为变量的函数,但收到以下错误:
不支持引用其他表的相关子查询,除非可以将它们取消相关,例如将它们转换为有效的JOIN。
答案 0 :(得分:0)
Cloud Composer(Apache Airflow)用于实现此类用例。您可以看看airflow.contrib.operators.bigquery_operator
。使用此运算符的示例如下:-
from airflow.contrib.operators import bigquery_operator
# Query recent StackOverflow questions.
bq_recent_questions_query = bigquery_operator.BigQueryOperator(
task_id='bq_recent_questions_query',
bql="""
SELECT owner_display_name, title, view_count
FROM `bigquery-public-data.stackoverflow.posts_questions`
WHERE creation_date < CAST('{max_date}' AS TIMESTAMP)
AND creation_date >= CAST('{min_date}' AS TIMESTAMP)
ORDER BY view_count DESC
LIMIT 100
""".format(max_date=max_query_date, min_date=min_query_date),
use_legacy_sql=False,
destination_dataset_table=bq_recent_questions_table_id)
完整的代码示例可以在这里找到[1]
答案 1 :(得分:0)
即使前面提到的Composer方法是一种选择,您也必须考虑它是否具有成本效益,Composer使用了大量可能昂贵的资源。
您可以尝试使用函数来提取nested JSON文件的参数,然后使用parameterized queries为查询提供这些参数。