我在 dbt (test_model) 中有一个模型,它接受地理变量(zip、state、region) 在配置中。我想通过遍历变量来运行模型三次,每次都使用不同的变量运行它。
关键是:我有一个如下所示的宏,它将变量附加到输出表名称的末尾(即运行 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_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 %}
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 次),我会:
- 创建一个脚本来为我生成所有这些 .sql 文件
- 创建 new materialization它接受了一个参数列表,但这将是一种 super 先进的 here-be-dragons 方法,可能仅当您已经用尽其他选项时才合适。
关于sql - 如何通过循环变量在 dbt 中多次运行 SQL 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73250933/