如何构建具有循环依赖性的 DBT 表
How to structure DBT tables with cyclical dependencies
我有一个 table 包含我的成员。
customer_id
name
age
1
John
74
2
Sarah
87
每天,我都会收到一个包含当前成员的新 table。
- 如果有新成员加入,我想加他们。
- 如果有会员离开,我想取消他们的name/id
- 如果当前会员仍然是会员,那么我希望他们保持原样。
想象一下,我得到一个包含以下行的新上传
customer_id
name
age
2
Sarah
87
3
Melvin
23
然后我想生成 table
customer_id
name
age
Null
Null
74
2
Sarah
87
3
Melvin
23
我不想错误地取消任何东西,因此我想 运行 在我更换旧的之前对这个 table 进行一些测试。我这样做的方法是创建一个临时的 table(我们称它为 customer_temp)。但是,我现在创建了一个循环依赖,因为我:
- 需要阅读实时 table 客户 才能创建 customer_temp
- 我需要用customer_temp替换现场table客户'我 运行 我的测试
我能用 dbt 做到这一点吗?
销毁数据很棘手。我会避免这种情况,除非有必要(例如,符合 DSAR)。
假设每天将新数据加载到数据库中的同一个 table 中,我认为这是快照的理想选择,可以选择使 hard-deleted 记录无效。参见docs。这使您可以捕获 table 的更改历史记录而不会丢失任何数据。
如果您在初始状态下打开快照,您的快照 table 将如下所示(假设现有记录的时间戳为 1/1):
customer_id
name
age
valid_from
valid_to
1
John
74
1/1/2022
2
Sarah
87
1/1/2022
然后,在源 table 更新后,re-running dbt snapshot
(今天)将创建此 table:
customer_id
name
age
valid_from
valid_to
1
John
74
1/1/2022
5/12/2022
2
Sarah
87
1/1/2022
3
Melvin
23
5/12/2022
您可以通过简单的查询创建您喜欢的格式:
select
case when valid_to is null then customer_id else null end as customer_id,
case when valid_to is null then name else null end as name,
age
from {{ ref('my_snapshot') }}
我有一个 table 包含我的成员。
customer_id | name | age |
---|---|---|
1 | John | 74 |
2 | Sarah | 87 |
每天,我都会收到一个包含当前成员的新 table。
- 如果有新成员加入,我想加他们。
- 如果有会员离开,我想取消他们的name/id
- 如果当前会员仍然是会员,那么我希望他们保持原样。
想象一下,我得到一个包含以下行的新上传
customer_id | name | age |
---|---|---|
2 | Sarah | 87 |
3 | Melvin | 23 |
然后我想生成 table
customer_id | name | age |
---|---|---|
Null | Null | 74 |
2 | Sarah | 87 |
3 | Melvin | 23 |
我不想错误地取消任何东西,因此我想 运行 在我更换旧的之前对这个 table 进行一些测试。我这样做的方法是创建一个临时的 table(我们称它为 customer_temp)。但是,我现在创建了一个循环依赖,因为我:
- 需要阅读实时 table 客户 才能创建 customer_temp
- 我需要用customer_temp替换现场table客户'我 运行 我的测试
我能用 dbt 做到这一点吗?
销毁数据很棘手。我会避免这种情况,除非有必要(例如,符合 DSAR)。
假设每天将新数据加载到数据库中的同一个 table 中,我认为这是快照的理想选择,可以选择使 hard-deleted 记录无效。参见docs。这使您可以捕获 table 的更改历史记录而不会丢失任何数据。
如果您在初始状态下打开快照,您的快照 table 将如下所示(假设现有记录的时间戳为 1/1):
customer_id | name | age | valid_from | valid_to |
---|---|---|---|---|
1 | John | 74 | 1/1/2022 | |
2 | Sarah | 87 | 1/1/2022 |
然后,在源 table 更新后,re-running dbt snapshot
(今天)将创建此 table:
customer_id | name | age | valid_from | valid_to |
---|---|---|---|---|
1 | John | 74 | 1/1/2022 | 5/12/2022 |
2 | Sarah | 87 | 1/1/2022 | |
3 | Melvin | 23 | 5/12/2022 |
您可以通过简单的查询创建您喜欢的格式:
select
case when valid_to is null then customer_id else null end as customer_id,
case when valid_to is null then name else null end as name,
age
from {{ ref('my_snapshot') }}