我在 dbt (test_model) 中有一个模型,它在配置中接受地理变量 (zip、state、region)。我想通过循环变量来运行模型三次,每次使用不同的变量运行它。
这里有一个问题:我有一个如下所示的宏,它将变量附加到输出表名称的末尾(即,使用 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_zip、test_model_state 和 test_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 %}
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 次),我会: