1

正如问题所说,我正在运行dbt snapshot命令并且我的一些快照不起作用,因为 DBT 没有识别id我创建的代理键。我的快照都是以相同的方式构建的,它们所基于的基本视图也是如此。以下是由于无法识别代理键而无法正常工作的快照示例:

{% snapshot example_snapshot %}
    {{ config(
        target_schema = 'snapshots',
        unique_key = 'id',
        strategy = 'check',
        check_cols = 'all'
    ) }}

    SELECT
        *
    FROM
        {{ ref('base_example') }}
{% endsnapshot %}

接下来是它引用的基本视图的示例:

WITH src AS (
    SELECT
        *
    FROM
        {{ source(
            'tomato',
            'potato'
        ) }}
),
cleaned AS (
    SELECT
        *,
        {{ dbt_utils.surrogate_key(['column', 'another_column', 'yet_another_column']) }} AS id
    FROM
        src
)
SELECT 
    *
FROM 
    cleaned

请记住,当我运行该命令时dbt run -m [base_example],它会生成一个视图,在该视图中我可以看到生成为代理键的哈希值。问题仅在我运行时出现dbt snapshot。事实上,dbt snapshot --select [example_snapshot]一次只运行一个快照不会给我任何快照的任何错误。最令人困惑的部分:我有一个基本视图和该基本视图的快照,其配置与其他 3 个不工作的视图完全相同,但它在创建快照时识别代理键。我很困惑,任何帮助将不胜感激。

4

1 回答 1

0

以我的经验,当依赖于 dbt 模型(通过ref('base_example'))而不是源时,快照可能会有点不稳定。建议从源代码中选择,尽管文档中没有详细解释为什么

由于您的转换只是基于源中的三列添加代理键,我想知道您是否可以将转换粘贴在unique_key参数 á la 中(这里在 Redshift 领域思考,无需测试):

{% snapshot example_snapshot %}
    {{ config(
        target_schema = 'snapshots',
        unique_key = 'md5(column, another_column, yet_another_column)',
        strategy = 'check',
        check_cols = 'all'
    ) }}

    SELECT
        *
    FROM
        {{ source('tomato', 'potato') }}
{% endsnapshot %}
于 2021-03-03T07:01:08.887 回答