数据已删除但历史同步到的数据进行打标"/>
Kettle实现对源数据已删除但历史同步到的数据进行打标
目标背景:
通过Kettle实现ETL将A库A数据同步到B库B表,但是业务数据有物理删除,再B库B表中想要和A库A表数据一致
解决方法一:
做全量同步,再下一次同步之前,先全部truncate/delete 情况表所有数据,再做当前原表信息数据全量新增Insert
解决方式二:
当我同步到B库B表的数据,根据业务情况,不能做数据删除时,如何解决增量同步时由于上游物理删除产生再库里的“历史脏数据”,解法---对数据打标记falg ,对数据打标如何实现?具体解法如下
打标,涉及到数据比对,用kettle的增量同步(insert/update组件)同步数据的方式怎么进行数据比对? 目前我还没有实践出解法,我的解法是增加一个打标的过程处理
因为源和目标是AB两个库,没法使用SQL脚本做两个表的直接查询或者是关联查询比较出已经不存在的数据,源也只会给我他当时存在的数据,给不出删除信息。
考虑解法:
1、既然不能再SQL脚本里关联两个不同源的表,是否能通过把原表数据都查出来,用SQL脚本通过select not in 来获取 脏数据?
结果:由于取数据的表数据是一个数据流过程,再连接传输时是一条数据一条数据传递,如果用SQL脚本 去查源表,查不到的数据,无法再继续往下流转作为我打标的参数,无法实现目的。
2、既然不能再SQL脚本里关联两个不同源的表,是否能通过组件再Kettle里实现数据JOIN,然后将查不到的NULL数据通过SQL脚本删除?
结果:通过取两个表的唯一主键数据,通过排序合并(排序合并是必须的)用记录集连接,将数据left join,然后再通过过滤记录,筛出关联值为null的主键,作为参数穿给,执行SQL脚本,进行数据删除。
如下图:
步骤分讲:
步骤1:表输入->取两个库的表数据(只取主键,并排序)
表一contract,具有历史脏数据需要打标的表
表二contract,源数据表里面不包含已删除数据。
步骤二:排序合并
表一配置
表二配置
步骤三:核心步骤-记录集连接
此方法可以使表一表二进行关联,此处使用left outer zuo左关联,主表是表一(带有脏数据)
步骤四:核心步骤-过滤记录
选择将true结果传递给下已给sql脚本,条件使用表二中额外附加的主键字段,如果该字段是NULL则表名是需要标记的脏数据。
步骤五:执行SQL脚本
选择流中的主键字段作为参数传递给sql,执行每一行,变量替换。
以上配置完毕,
看下执行日志:(行级别)
比较出不一致的数据进行更新
执行结果:实现对63行已删除数据打标
效率:
近8万数据,标记63行问题数据,1min左右
终极目标,怎么实现再同步数据时,既同步新增和更新,又对脏数据进行标记
解法:将两个独立的线程放在一个里面
如下图:
一起执行
评估:
放在一起会不会产生操作同一行数据,导致读写数据锁表,答案是不会的,因为新增和更新都是操作原表有的数据,而大标记是操作原表取不到的数据,两个线程不会对同一行进行操作。
结果上实现了对增量同步对物理删除数据打标,性能良好。
感谢观看
更多推荐
Kettle实现对源数据已删除但历史同步到的数据进行打标
发布评论