如何配置DBT日历维度模型仅在显式指定时运行?
实现DBT日历维度模型仅显式运行的方案
为什么增量物化方案不生效
增量模型的逻辑是:首次运行执行全量创建,后续运行进入is_incremental()分支。你留空分支代码的话,dbt还是会执行全量逻辑(首次)或者跳过增量但不会跳过整个模型执行,所以达不到仅显式运行的目的。
可行解决方案
变量开关控制
在日历维度模型的SQL开头加入条件判断,只有当指定变量为true时才生成数据:{% if var('run_calendar_dim', false) %} -- 这里写你的日历维度生成逻辑,示例: select date_day, year(date_day) as calendar_year, month(date_day) as calendar_month from generate_series('2020-01-01'::date, '2030-12-31'::date, '1 day'::interval) as date_day {% else %} -- 变量未开启时返回空结果,避免创建/更新表 select * from where 1=0 {% endif %}运行时显式指定变量触发:
dbt run --models calendar_dim --vars '{"run_calendar_dim": true}'平时常规运行时,因为变量默认是
false,模型只会返回空结果,不会实际生成或更新日历数据。标签+选择性运行
在模型的dbt_project.yml或模型文件头部给日历模型加专属标签:models: your_project: calendar_dim: tags: ["manual_only"]日常运行时排除这个标签的模型:
dbt run --exclude tag:manual_only需要运行日历维度时,单独指定标签:
dbt run --select tag:manual_only自定义物化方式(进阶)
可以创建一个自定义物化宏,命名为manual,逻辑是仅当指定变量存在时才执行模型:{% materialization manual, default %} {% set target_relation = this %} {% if var('run_manual_models', false) %} -- 执行常规的表创建/替换逻辑 {% call statement('main') %} {{ sql }} {% endcall %} {% else %} {{ log("Skipping manual materialization for " ~ target_relation, info=True) }} {% endif %} {{ return({'relations': [target_relation]}) }} {% endmaterialization %}然后在日历模型头部指定使用这个物化:
{{ config(materialized='manual') }}运行时通过变量触发:
dbt run --models calendar_dim --vars '{"run_manual_models": true}'
内容的提问来源于stack exchange,提问作者Ashley Betts
相关产品推荐
相关产品推荐

