在dbt快照中捕获有限的历史数据

问题描述 投票:0回答:1

我们有一个 DBT 快照,每天运行并检查现有数据是否过期,然后将最新数据插入到快照表中。由于快照每天运行,快照表中的数据呈指数级增长,我们希望根据列的子集限制历史更改,同时捕获从 dbt 模型到快照的最新数据。

考虑下面的例子

第1栏 第2栏 第3栏 第4栏 dbt_valid_from dbt_valid_to
A B C D 2023-06-01 2023-06-02
A B X D 2023-06-02 2023-06-03
A X D 2023-06-03 2023-06-04
A Z X D 2023-06-04

column2和column3是配置块中的检查列,如下所示

 {{
    config(
      target_schema='snapshots',
      strategy='check',
      unique_key='column1',
      check_cols=['column2', 'column3'],
    )
}}

现在快照可以按预期工作。我们的要求是检查列column2和column3并定期更新快照,但跳过捕获column2更改的历史记录,因为column2中的数据变化非常频繁,因此表量不断增长,下游应用程序面临检索数据的挑战从这个快照表。如果第 3 列中有任何更改,我们需要捕获这些更改的历史记录,因为下游应用程序需要此信息。

输出应该看起来像这样

2023-06-03 快照中的数据应该是这样的

第1栏 第2栏 第3栏 第4栏 dbt_valid_from dbt_valid_to
A B C D 2023-06-01 2023-06-02
A B X D 2023-06-02 2023-06-03
A X D 2023-06-03

2023-06-04 快照中的数据应该是这样的

第1栏 第2栏 第3栏 第4栏 dbt_valid_from dbt_valid_to
A B C D 2023-06-01 2023-06-02
A B X D 2023-06-02 2023-06-03
A Z X D 2023-06-03

因此,理想情况下,如果第 2 列有任何更改,我们应该从模型中捕获最新数据,但它不应该包含快照历史记录。有没有办法使用 dbt 快照来实现这一点。

dbt
1个回答
0
投票

为了实现您想要捕获

column3
的更改但仅更新
column2
的最新数据而不在 dbt 快照中维护其历史更改的需求,我们可以使用 post-hook 来调整快照的行为。以下是如何构建 dbt 快照配置并包含一个后钩子来处理
column2
。 这样的事情可能会有所帮助:

{{
    config(
        target_schema='snapshots',
        strategy='check',
        unique_key='column1',
        check_cols=['column3'],  -- Only track historical changes for column3
        post_hook=[
            "UPDATE {{ this }} AS snp SET column2 = source_data.column2
            FROM {{ ref('your_source_model') }} AS source_data
            WHERE snp.column1 = source_data.column1
              AND snp.column2 <> source_data.column2
              AND snp.dbt_valid_to IS NULL"
        ]
    )
}}
© www.soinside.com 2019 - 2024. All rights reserved.