dbt - jinja - bigquery - 查询优化
Posted
技术标签:
【中文标题】dbt - jinja - bigquery - 查询优化【英文标题】:dbt - jinja - bigquery - Query optimization 【发布时间】:2021-05-12 23:10:10 【问题描述】:我在dbt
中有一个模型,它计算每列的一些统计信息(例如,count_nulls
)并将其与所有其他列联合。如果列数很大,这将成为一个问题。其中一个数据集有大约 700 列,BigQuery 抱怨 Resources exceeded during query execution: Not enough resources for query planning - too many subqueries or query is too complex
#for each column in the table
% for col in results_list %
(
SELECT
COUNTIF( col is NULL) as count_nulls,
COUNTIF( col is NOT NUll) as count_not_nulls,
FROM
` var('src_project') . var('src_schema') . var('table_name') `
)
%- if not loop.last %
UNION ALL
%- endif %
% endfor %
我正在考虑是否将 result_list 拆分为 100 个组,但我不确定如何概括它。
您知道如何使这项工作适用于大型列数据集吗?
【问题讨论】:
除了查询复杂性之外,不清楚 UNION 操作会给您带来什么,这部分是错误试图传达的内容。您似乎没有投影列名,所以您只是在此之后对它们求和吗?考虑在你的选择中移动 for 循环,或者生成一个数组类型,或者只是将所有计数折叠到一个 SUM() 中,也许? 【参考方案1】:怎么样:
#for each column in the table
SELECT
% for col in results_list %
COUNTIF( col is NULL) as col _count_nulls,
% endfor %
FROM
` var('src_project') . var('src_schema') . var('table_name') `
UNION ALL
SELECT
% for col in results_list %
COUNTIF( col is NOT NUll) as col _count_not_nulls
% endfor %
FROM
` var('src_project') . var('src_schema') . var('table_name') `
这将为您提供一个包含约 700 列和两行的表格,其中包含您的指标。
【讨论】:
以上是关于dbt - jinja - bigquery - 查询优化的主要内容,如果未能解决你的问题,请参考以下文章
使用 dbt for-loop 在 BigQuery 中创建多个表