使用 iUAP DI 进行基于快照的变更数据捕捉( CDC )
如果 源表没有时间戳 , 没不能用触发器,就要用快照表了,通过比对获得数据的变化。快照 表 就是一次性抽取系统中全部数据,把这些数据加载到数据仓库的缓冲区中。下一次 需要 同步时, 再 从源系统中抽取全部数据,并把全部数据也放到数据仓库的缓冲区中,作为这个表的第二个版本,然后再比较这两个版本的数据,找到变化。 例如 ,两列的表,列名是 ID 和 Color 。这个表的两个版本如下 图 :
快照 1
ID |
COLOR |
1 |
Black |
2 |
Green |
3 |
Red |
4 |
Blu |
快照 2
ID |
COLOR |
1 |
Grey |
2 |
Green |
4 |
Blu |
5 |
Yellow |
有 很多方法可以获取这两个版本数据的差异。第一个 办法就是 在主键 ID 上做外连接并根据字段的比较结果增加一个标志字段( I 表示插入, U 表示 更新 , D 表示删除, N 表示 没有变化),另外过滤掉没有变化的记录。
SELECT * FROM
( SELECT CASE WHEN T2.ID IS NULL THEN 'D'
WHEN T1.ID IS NULL THEN 'I'
WHEN T1.COLOR <> T2.COLOR THEN 'U'
ELSE 'N'
END AS FLAG
, CASE WHEN T2.ID IS NULL THEN T1.ID
ELSE T2.ID
END AS ID
, T2.COLOR
FROM SNAPSHOT_1 T1 FULL OUTER JOIN SNAPSHOT_2 T2 ON T1.ID = T2.ID) A
WHERE FLAG <> 'N'
结果 如下表:
F lag |
ID |
COLOR |
U |
1 |
Grey |
D |
3 |
NULL |
I |
5 |
Yellow |
在 iUAP DI 中也可以 比较表之间的差异 , 并增加一个标志字段表示 I , U , D 的变化 , 使用记录比对,就可以做同样的工作 。设置 如下 图 :
对比后 的预览 结果 如下:
ID |
COLOR |
F lag |
1 |
Grey |
changed |
2 |
Green |
identical |
3 |
Red |
deleted |
4 |
Blu |
identical |
5 |
Yellow |
new |
可以 根据 Flag 的值 ,利用 switch/case 对 Flag 进行分流,进而对目标进行 记录 的删除 、 更新 和 插入。 完整 ETL 过程 见 附件。
在实际 应用中,快照表 一般不允许 建立在源 数据库 端 和数据仓库中, 最好建立一个缓冲数据库保存快照数据 。
基于 快照的 CDC 可以 检测 插入 、 更新和删除的数据,这是其优点,缺点是需要 大量 的存储空间来保存快照数据,另外数据 量 比较大 时 ,有严重的性能问题 。 使用 数据 库的比较相对 ETL 引擎 的性能 要 高, 有时 可以尝试第一种方法。
Attachments:
使用iUAP DI进行基于快照的变更数据捕捉.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)
使用iUAP DI进行基于快照的变更数据捕捉.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)
使用iUAP DI进行基于快照的变更数据捕捉.docx (application/vnd.openxmlformats-officedocument.wordprocessingml.document)
基于快照的增量更新.aedi (application/x-upload-data)