多个临时表的CDC策略

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

我正在按照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表只是部分填充,因此我无法正确更新此处所示的维度。

从逻辑上讲,我理解我需要能够将维度使用的所有字段作为delta计算的一部分包含在内,以便在更新维度时获得完整记录的副本,但我不确定在我的临时区域实现这一点的最佳方法。如图所示,我目前只有独立的临时表,每个表分别计算它们的增量。

请问有人可以提供最好的处理方法吗?我仔细检查了Kimball的书,但无济于事。我在任何在线论坛上都没有找到合适的答案。这是一个常见问题,所以我确信存在一个合适的架构模式来解决这个问题。

etl data-warehouse cdc
1个回答
0
投票

您需要比较已连接的记录或查找当前的维度值。

如果(未更改的)数据量不是过多,您可以在APP_ID上将STG_APPLICATION和STG_APPLICATION_STATUS的完整快照加在一起,直到它们与列维度记录类似,并将它们存储在单独的表中,并将其CDC哈希值用作前一天。然后,您可以在此级别获取增量,并将(完整的)已更改的记录作为更新发送到维度。

如果每日更新中的记录数量使加入完整表格变得不切实际,您可以像现在一样使用增量和全外部连接它们。然后,您查找此APP_ID的当前维度记录,并填写增量记录中的所有空字段。然后,已完成的记录将作为维度的更新发送。此解决方案需要较少的存储空间,但似乎更脆弱,尤其是在一天内可能进行多次更改的情况下。如果有很多变化,性能也可能受到影响。对于数百万条记录中的少数变化,它应该更有效率。

© www.soinside.com 2019 - 2024. All rights reserved.