使用 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 中的表连接更改数据捕获的主要内容,如果未能解决你的问题,请参考以下文章