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

问题描述 投票:0回答:1

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

这里有一个问题:我有一个如下所示的宏,它将变量附加到输出表名称的末尾(即,使用 zip 运行 test_model,因为变量输出一个名为 test_model_zip 的表)。这是通过在模型顶部添加

{{ config(alias=var('geo')) }}
来完成的。

无论是在 dbt_project.yml 中、模型本身还是在 CLI 上定义变量,我都无法找到一种方法来循环这些变量,每次将新变量传递给配置,并成功创建三个表。你们中有人知道如何实现这一目标吗? 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

sql google-bigquery jinja2 dbt
1个回答
4
投票

我会把它颠倒过来。

dbt 实际上没有参数化模型的概念,因此如果您在多个位置具体化单个模型,您将丢失沿袭(DAG 关系)和文档/等。会变得很困惑。

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

geo_model_macro.sql

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

my_model_zip.sql

{{ geo_model_macro('zip') }}

my_model_state.sql

{{ geo_model_macro('state') }}

my_model_region.sql

{{ geo_model_macro('region') }}

如果我需要执行此操作数百次(而不是 3 次),我会:

  1. 创建一个脚本来为我生成所有这些 .sql 文件
  2. 创建一个接受参数列表的新物化,但这将是一种超级先进的、这里是龙的方法,可能只适用于你已经最大化了其他选项的情况。
© www.soinside.com 2019 - 2024. All rights reserved.