我们有一个 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 快照来实现这一点。
为了实现您想要捕获
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"
]
)
}}