dbt_utils.surrogate_key() 包含除两个以外的所有字段
dbt_utils.surrogate_key() with all fields except two
我目前正在使用 dbt 并尝试构建一个 PSA(持久暂存区),在我看来,快照功能非常适合这一点。但是,我在源代码中没有时间戳,所以我必须使用“检查”策略。
对于“check_cols”我想用hash值,于是想到了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_utils.star() 的 return 值。
我怎样才能在这里进行,以便 surrogate_key() 可以从 return?
计算哈希值
检查源代码,dbt_utils.star,returns格式中的列
`col1` as `col1`,
`col2` as `col2`,
...
引号取决于适配器(示例中的 BigQuery)并且包含使用 as
的别名,因为该方法可以获得 suffix
和 prefix
参数
dbt_utils.surrogate_key
需要一个值列表,而不是 dbt_utils.star
返回的字符串
我在 dbt Slack group using 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')}}
在您的情况下,您想忽略某些列,因此我们可以对列表应用 reject 过滤器
{% 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 %}
我目前正在使用 dbt 并尝试构建一个 PSA(持久暂存区),在我看来,快照功能非常适合这一点。但是,我在源代码中没有时间戳,所以我必须使用“检查”策略。
对于“check_cols”我想用hash值,于是想到了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_utils.star() 的 return 值。 我怎样才能在这里进行,以便 surrogate_key() 可以从 return?
计算哈希值检查源代码,dbt_utils.star,returns格式中的列
`col1` as `col1`,
`col2` as `col2`,
...
引号取决于适配器(示例中的 BigQuery)并且包含使用 as
的别名,因为该方法可以获得 suffix
和 prefix
参数
dbt_utils.surrogate_key
需要一个值列表,而不是 dbt_utils.star
我在 dbt Slack group using 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')}}
在您的情况下,您想忽略某些列,因此我们可以对列表应用 reject 过滤器
{% 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 %}