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 jinja 中将两个表加入字典

运行 dbt 时 BigQuery“超出最大重试次数”

使用 dbt for-loop 在 BigQuery 中创建多个表

dbt(数据构建工具)神社模块-'dict object'没有属性're'

dbt 宏 - 使用 *args/**kwargs

将查询结果存储在变量中(jinja)