dbt_utils.surrogate_key(),包含除两个字段之外的所有字段



我目前正在玩dbt,并试图构建一个PSA(持久暂存区(,在我看来,快照功能非常适合这一点。然而,我在源中没有时间戳,所以我必须使用";"检查";策略

对于";check_ cols";我想使用散列值,所以我想到了dbt_utils.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
)
}}
select {{ dbt_utils.surrogate_key(['Tenant','ItemNo']) }} as item_id,
{{ dbt_utils.surrogate_key( dbt_utils.star(from=source('sourceA', 'item'), except=["fieldA", "fieldB"]) ) }} as diff_hash,
* 
from {{ source('sourceA', 'item') }}
{% endsnapshot %}

遗憾的是,dbt_utils.surrogate_key((无法处理dbt_util.star((的返回值。我如何在这里继续,以便surrogate_key((可以从返回中计算哈希值?

检查源代码dbt_utils.star,返回格式的列

`col1` as `col1`,
`col2` as `col2`,
...

引号取决于适配器(示例中为BigQuery(,并且包括使用as的别名,因为该方法可以获得suffixprefix参数

dbt_utils.surrogate_key需要一个值列表,而不是dbt_utils.star返回的字符串

我在dbt Slack组中使用get_columns_in_relation 找到了一个解决方案

感谢Lee Werner发布的解决方案:

{%- set columns = get_columns_in_relation(ref('my_model')) -%}
{% set column_names = columns|map(attribute='name')|list %}
SELECT
{{ dbt_utils.surrogate_key( column_names )}} as HashID,
*
FROM {{ref('my_model')}}

在您的情况下,您希望忽略一些列,因此我们可以对列表应用拒绝筛选器

{% 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 columns = get_columns_in_relation(source('sourceA', 'item')) -%}
{% set column_names = columns|map(attribute='name')|reject("in", ['fieldA','fieldB'])|list %}
select {{ dbt_utils.surrogate_key(['Tenant','ItemNo']) }} as item_id,
{{ dbt_utils.surrogate_key(column_names) }} as diff_hash,
* 
from {{ source('sourceA', 'item') }}
{% endsnapshot %}

最新更新