You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:36:06