【问题标题】:CDC strategy for multiple staging tables多个临时表的 CDC 策略
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 2015-09-27
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      相关资源
      最近更新 更多