使用 ETL 中的表连接更改数据捕获

Posted

技术标签:

【中文标题】使用 ETL 中的表连接更改数据捕获【英文标题】:Change Data Capture with table joins in ETL 【发布时间】:2013-01-16 13:44:32 【问题描述】:

在我的 ETL 过程中,我使用更改数据捕获 (CDC) 来仅发现自上次提取以来源表中已更改的行。然后我只对这些行进行转换。问题是,例如,当我有 2 个要加入一个维度的表时,其中只有一个发生了变化。例如,我有如下表国家和城镇:

国家:

ID Name
1  France

城镇:

ID Name  Country_ID
1  Lyon  1

现在假设向 Towns 表添加了一个新行:

ID Name  Country_ID
1  Lyon  1
2  Paris 2

Countries 表没有更改,因此这些表的 CDC 仅向我显示 Towns 表中的行。问题是当我在国家和城镇之间进行连接时,国家更改集中没有行,因此连接将导致空集。

你知道如何解决它吗?当然,可能会有更困难的情况,涉及 3 个或更多表以及后续连接。

【问题讨论】:

【参考方案1】:

这是在进行实时更改数据捕获,甚至是仅增量每日更改时发现的典型问题。

有多种方法可以解决这个问题。

一种方法是对维度或映射表中的自然键进行连接,以获取关联的国家/地区(SELECT distinct country_name, [..other attributes..] from dim_table where country_id = X)。

另一种选择是将连接作为变更捕获过程的一部分进行 - 当将一行加载到城镇时,触发将外键值加载到关联的临时表(国家等)中。

【讨论】:

【参考方案2】:

我可以喋喋不休地了解更多信息,但我会具体说明您的问题。我会建议以下获得结果...

1st Pass is where everything matches via the join... 
Union All 
2nd Pass Gets all towns where there isn't a country
(left outer join with a where condition that 
requires the ID in the countries table to be null/missing).

您可以将该不匹配联接中的国家/地区 ID 值默认为指定为“不匹配值”的值,通常使用 0 或 -1 或一系列标准负数,您可以稍后为其分配描述以确定数据为何对您的示例不利 -1 可能是“发现没有国家的城镇”。

【讨论】:

以上是关于使用 ETL 中的表连接更改数据捕获的主要内容,如果未能解决你的问题,请参考以下文章

ssis 找不到任何具有 odbc 连接的表

《BI项目笔记》增量ETL数据抽取的策略及方法

kettle庖丁解牛第10篇之表输入

解决Kettle ETL数据乱码

用于频繁更改表结构的 ETL

Pentaho ETL:数据库连接与表输入