如何在DBT快照全量加载时跳过Post Hook仅增量加载时执行?
实现DBT快照全量/增量模式下的Post Hook条件执行
完全可以实现全量加载时忽略Post Hook的需求,核心思路是通过变量控制+条件渲染来决定Post Hook是否执行,具体方案如下:
1. 定义加载模式变量
在快照配置中引入一个自定义变量(比如load_mode),用于标记当前是全量还是增量加载模式,默认值设为incremental保证常规增量逻辑不受影响。
2. 给Post Hook添加条件判断
在快照的post_hook配置里,使用Jinja2的条件语法,只有当load_mode为incremental时,才渲染并执行更新已删除条目的SQL语句。
完整代码示例
{% snapshot my_table_snapshot %} {{ config( target_database='your_db', target_schema='snapshots', unique_key='record_id', strategy='check', check_cols=['status', 'amount'], post_hook=[ {% if var('load_mode', 'incremental') == 'incremental' %} "UPDATE {{ this }} SET deleted_at = CURRENT_TIMESTAMP WHERE is_deleted = TRUE AND deleted_at IS NULL" {% endif %} ] ) }} SELECT record_id, status, amount, is_deleted FROM source('your_source_schema', 'your_source_table') {% endsnapshot %}
使用方式
- 全量加载:执行命令时显式指定全量模式,此时Post Hook中的更新语句不会被渲染执行:
dbt snapshot --vars '{load_mode: "full"}' - 增量加载:直接执行常规快照命令即可(默认使用
incremental模式),Post Hook会正常触发:dbt snapshot
注意事项
- 如果使用
timestamp类型的快照策略,上述条件判断逻辑同样适用,只需调整Post Hook中的业务SQL即可。 - 变量默认值设为
incremental是为了避免忘记指定变量时,破坏原有增量加载的Post Hook逻辑。
内容的提问来源于stack exchange,提问作者Sagar Morakhia
相关产品推荐
相关产品推荐

