sql - 如何通过循环变量在 dbt 中多次运行 SQL 模型?

标签 sql google-bigquery jinja2 dbt

我在 dbt (test_model) 中有一个模型,它接受地理变量(zipstateregion) 在配置中。我想通过遍历变量来运行模型三次,每次都使用不同的变量运行它。

关键是:我有一个如下所示的宏,它将变量附加到输出表名称的末尾(即运行 test_model 并使用 zip 作为变量输出一个名为 test_model_zip 的表)。这是通过在模型顶部添加 {{ config(alias=var('geo')) }} 来实现的。

无论是在 dbt_project.yml、模型本身还是在 CLI 上定义变量,我都无法找到循环遍历这些变量的方法,每次都将新变量传递给配置,并成功创建三张 table 。你们中有人知道如何实现这一目标吗? FWIW,我正在使用 BigQuery SQL。

宏:

{% macro generate_alias_name(custom_alias_name=none, node=none) -%}

    {%- if custom_alias_name is none -%}

        {{ node.name }}

    {%- else -%}

        {% set node_name = node.name ~ '_' ~ custom_alias_name %}
        {{ node_name | trim }}

    {%- endif -%}

{%- endmacro %}

模型,通过在 CLI 中输入 dbt run --select test_model.sql --vars '{"geo": "zip"}' 运行:

{{ config(materialized='table', alias=var('geo')) }}

with query as (select 1 as id)

select * from query

当前输出:一个名为 test_model_zip 的表。

所需的输出:名为 test_model_ziptest_model_statetest_model_region 的三个表。

最佳答案

我会颠倒过来。

dbt 并没有真正的参数化模型的概念,因此如果您在多个地方具体化一个模型,您将失去沿袭(DAG 关系)和文档/等。会感到困惑。

更好的做法是创建多个模型文件,这些文件只需调用具有不同参数的宏,如下所示:

geo_model_macro.sql

{% macro geo_model_macro(grain) %}
select
    {{ grain }},
    count(*)
from {{ ref('my_upstream_table') }}
group by 1
{% endmacro %}

test_model_zip.sql

{{ geo_model_macro('zip') }}

test_model_state.sql

{{ geo_model_macro('state') }}

test_model_region.sql

{{ geo_model_macro('region') }}

如果我需要这样做数百次(而不是 3 次),我会:

  1. 创建一个脚本来为我生成所有这些 .sql 文件
  2. 创建 new materialization它接受了一个参数列表,但这将是一种 super 先进的 here-be-dragons 方法,可能仅当您已经用尽其他选项时才合适。

关于sql - 如何通过循环变量在 dbt 中多次运行 SQL 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73250933/

相关文章:

c# - 使用参数化 SqlCommand 是否可以使我的程序免受 SQL 注入(inject)的影响?

sql - BigQuery 中交叉联接后的行聚合

google-bigquery - 在 Bigquery 中查找一个字符串在另一个字符串中的位置

Python Jinja2 latex 表

html-email - 使用 Jinja 渲染带有内联 CSS 的 HTML 电子邮件

python - 如何从 Jinja 的列表中准确获取一个元素?

sql - Oracle SQL "EXECUTE IMMEDIATE"ORA-00922/06512 创建表

MySQL group by 没有聚合时

sql - Teradata 更改周数的格式

google-bigquery - BigQuery 返回完全相同的 SELECT 查询的不一致(= 不同)结果,执行时间除外