使用 iUAP DI 进行基于数据源的变更数据捕捉( CDC )
基于 源数据的 CDC 要求源数据 库 里面有相关的属性列, ETL 的过程可以利用这些属性列,来判断出 哪些 数据时增量数据 。 最常见 的 属性列有两种 :
时间 戳: 需要 一个 更新的时间戳,最好有两个 时间戳 ,一个插入时间,一个最后一次更新时间。
序列 : 利用数据库的自增序列 , 很容易识别出新插入的数据。
这两种 方法都需要一个额外的数据库表来存储上一次更新的时间或上次抽取的最后一个序列号。在实践 中 ,一般是在一个独立的模式 下 创建这个参数表,不会在数据仓库和数据集市中创建。基于 时间戳 和自增序列的方法是 CDC 中 最简单 的实现方式,所以也是最常用的方法。但 其 缺点也是显而易见的,主要如下:
区分 插入和更新操作: 只有数据源中包含插入时间和更新时间两个时间戳时,才能区别是插入和更新操作,否则无法区分。
删除 记录的操作: 不能捕捉 到 物理 删除操作 , 除非是 逻辑删除 ,即 记录 没有真正的删除,只是立了个墓碑(做逻辑标志 ) ;
多次 更新检测: 如果在一次同步周期内,数据被多次 更新, 只能同步最后一次更新的操作, 中间 的更新丢失 了 。
实时能力 : 时间戳和 基于 序列的数据抽取一般适用于批量操作,不适用于实时场景的数据加载。
在 iUAP DI 中使用时间戳的方式 CDC 例子 :
首先 ,创建时间戳表 CDC_ TIME, 并 出示化数据 :
CREATE TABLE CDC_TIME(
TABLENAME VARCHAR2(255) NOT NULL PRIMARY KEY
,LAST_LOAD TIMESTAMP
,CURRENT_LOAD TIMESTAMP
);
INSERT INTO CDC_TIME VALUES ( 'CUSTOMER' ,
to_date ( '1970-01-01 00:00:01' , 'yyyy-mm-dd hh24:mi:ss' ),
to_date ( '1970-01-01 00:00:01' , 'yyyy-mm-dd hh24:mi:ss' ));
其次, 更新 current _load 为 当前时间。
再次, 根据时间戳加载数据 。
最后 ,修改 current _load 和 last_load 相同 。
详细 的作业截图如下:
图 1 作业 流程图
图 2 检查 表是否存在 设置
图 3 创建时间戳 表并初始化数据
图 4 更新时间戳 转换流程
图 5 增量 抽取数据转换流程
图 6 增量 抽取数据 读取 时间戳
图 7 增量 抽取数据 读取数据
图 8 增量 抽取数据 插入更新
图 9 修改 时间戳 表 current _load 和 last_load 相同
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)