问题
主要问题
如何从每日提取的文件夹中临时实现缓慢变化的维度类型 2,其中每个 csv 都是来自源系统的表的完整提取?
理由
我们正在设计临时数据仓库作为最终用户的数据集市,可以在没有任何后果的情况下启动和烧毁。这要求我们在一个湖/块/桶中拥有所有数据。
我们每天都在提取完整的提取物,因为:
- 我们不能可靠地仅提取变更集(出于我们无法控制的原因),并且
- 我们想维护一个包含“最原始”数据的数据湖。
挑战问题
有没有一种解决方案可以给我一个特定日期的状态,而不仅仅是“最新”状态?
存在问题
我是否完全倒退了这一点,并且有更简单的方法可以做到这一点?
可能的方法
自定义dbt
物化
包中有一个insert_by_period
dbt 实现dbt.utils
,我认为这可能正是我正在寻找的?但是我很困惑dbt snapshot
,但是:
dbt snapshot
一次增量地为每个文件运行;和,- 直接从外部表构建?
三角洲湖
我对 Databricks 的 Delta Lake 了解不多,但看起来应该可以使用Delta Tables吗?
修复提取作业
如果我们可以让我们的提取物只包含自上次提取物以来发生的变化,我们的问题就解决了吗?
例子
假设以下三个文件位于数据湖的文件夹中。(要点 3 个 csvs 和所需的表格结果为 csv)。我添加了 Extracted 列,以防从文件名中解析时间戳太棘手。
2020-09-14_CRM_extract.csv
| OppId | CustId | Stage | Won | LastModified | Extracted |
|-------|--------|-------------|-----|--------------|-----------|
| 1 | A | 2 - Qualify | | 9/1 | 9/14 |
| 2 | B | 3 - Propose | | 9/12 | 9/14 |
2020-09-15_CRM_extract.csv
| OppId | CustId | Stage | Won | LastModified | Extracted |
|-------|--------|-------------|-----|--------------|-----------|
| 1 | A | 2 - Qualify | | 9/1 | 9/15 |
| 2 | B | 4 - Closed | Y | 9/14 | 9/15 |
| 3 | C | 1 - Lead | | 9/14 | 9/15 |
2020-09-16_CRM_extract.csv
| OppId | CustId | Stage | Won | LastModified | Extracted |
|-------|--------|-------------|-----|--------------|-----------|
| 1 | A | 2 - Qualify | | 9/1 | 9/16 |
| 2 | B | 4 - Closed | Y | 9/14 | 9/16 |
| 3 | C | 2 - Qualify | | 9/15 | 9/16 |
最终结果
以下是截至 9 月 16 日的三个文件的 SCD-II。9/15 的 SCD-II 将是相同的,但OppId=3
只有一个来自valid_from=9/15
和valid_to=null
| OppId | CustId | Stage | Won | LastModified | valid_from | valid_to |
|-------|--------|-------------|-----|--------------|------------|----------|
| 1 | A | 2 - Qualify | | 9/1 | 9/14 | null |
| 2 | B | 3 - Propose | | 9/12 | 9/14 | 9/15 |
| 2 | B | 4 - Closed | Y | 9/14 | 9/15 | null |
| 3 | C | 1 - Lead | | 9/14 | 9/15 | 9/16 |
| 3 | C | 2 - Qualify | | 9/15 | 9/16 | null |