【发布时间】:2019-04-12 13:03:20
【问题描述】:
我正在按照 Kimball 方法实施数据集市,但在将来自多个源表的增量应用于单个目标维度时遇到了挑战。
以下是传入源数据的示例:
STG_APPLICATION
APP_ID, APP_NAME, APP_START_DATE, CDC_HASH, ...
1, FOOBAR, 20/10/2018, MD5_XXX
STG_APPLICATION_STATUS
APP_ID, STATUS_CODE, STATUS_DESC, CDC_HASH, ...
1, SUBMITTED, "APP WAS SUBMITTED", MD5_YYY
这些表中的每一个(还有其他几个)代表源数据的规范化版本,即单个应用程序可以有一个或多个与之关联的状态。
现在,因为我们只获得这些表的完整 alpha,所以我们必须进行快照合并,即针对每个单独表的前一天记录集对当天的记录集应用完整的外部联接。这是通过比较 CDC_HASH(所有源列的连接)来计算的。此比较的结果存储在一个增量表中,如下所示:
STG_APPLICATION_DELTA
APP_ID, APP_NAME, APP_START_DATE, CDC_HASH, CDC_STATUS ...
STG_APPLICATION_STATUS
APP_ID, STATUS_CODE, STATUS_DESC, CDC_HASH, CDC_STATUS...
1, AWARDED, "APP WAS AWARDED", MD5_YYY, NEW
因此,在此示例中,第一个表 STG_APPLICATION 没有生成增量记录,因为与该表相关的属性在每日加载之间没有变化。但是,关联表 STG_APPLICATION_STATUS 确实计算了一个增量,即自上次加载以来一个或多个字段已更改。这由 CDC_STATUS 突出显示,将其标识为要插入的新记录。
现在的问题当然是在加载目标维度时如何正确处理这种情况?例如:
DIM_APPLICATION
ID, APPLICATION_ID, APP_NAME, APP_START_DATE, APP_STATUS_CODE, FROM_DATE, TO_DATE
1, 1, FOOBAR, 20/10/2018, SUBMITTED, 20/10/2018, 12/04/2019
2, 1, NULL, NULL, NULL, AWARDED, 13/04/2019, 99/99/9999
这显示了第一条记录 - 基于这两个正在连接的临时表 - 以及第二条记录,该记录旨在反映记录的更新版本。但是,如前所述,我的 Delta 表仅填充了部分内容,因此我无法正确更新此处所示的维度。
从逻辑上讲,我知道我需要能够将维度使用的所有字段作为增量计算的一部分包含在内,以便在更新维度时拥有完整记录的副本,但我没有确定在我的暂存区实现这一点的最佳方法。如前所述,我目前只有独立的临时表,每个临时表都单独计算它们的增量。
请有人建议处理此问题的最佳方法吗?我在这方面仔细研究了 Kimball 的书籍,但无济于事。我同样在任何在线论坛上都找不到合适的答案。这是一个常见问题,因此我确信存在合适的架构模式来解决此问题。
【问题讨论】:
标签: etl data-warehouse cdc