dbt快照使用check策略时如何排除指定字段生成surrogate_key哈希值
问题原因
dbt_utils.star()返回的是逗号拼接的列名字符串(格式为col1, col2, col3),而dbt_utils.surrogate_key()要求传入列表格式的列名参数,二者参数格式不匹配,所以直接调用会报错。
解决方法
先获取源表的全量列信息,手动过滤掉不需要参与哈希计算的字段,生成列名列表后再传给surrogate_key即可,调整后的快照代码如下:
{% snapshot Item_hist %} {{ config( unique_key='item_id', strategy='check', check_cols=['diff_hash'], target_database='PSA', target_schema='sourceA', alias= 'Item', invalidate_hard_deletes=True ) }} {# 定义源表、排除字段,生成参与哈希计算的列名列表 #} {%- set source_relation = source('sourceA', 'item') -%} {%- set exclude_cols = ["fieldA", "fieldB"] -%} {%- set all_columns = adapter.get_columns_in_relation(source_relation) -%} {%- set hash_calc_cols = all_columns | map(attribute='name') | reject('in', exclude_cols) | list -%} select {{ dbt_utils.surrogate_key(['Tenant','ItemNo']) }} as item_id, {{ dbt_utils.surrogate_key(hash_calc_cols) }} as diff_hash, * from {{ source_relation }} {% endsnapshot %}
额外说明
- 如果你使用的是较新版本的
dbt-utils,可以直接调用dbt_utils.get_filtered_columns_in_relation宏简化列过滤的逻辑,不需要手动调用adapter接口:{%- set hash_calc_cols = dbt_utils.get_filtered_columns_in_relation( from=source('sourceA', 'item'), except=["fieldA", "fieldB"] ) | map(attribute='name') | list -%} - 这套逻辑会自动纳入源表后续新增的字段参与哈希比对,不需要手动修改代码,完全适配持久化暂存区的全字段变更追踪需求。
内容的提问来源于stack exchange,提问作者joboro
相关产品推荐
相关产品推荐

