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左右

终极目标,怎么实现再同步数据时,既同步新增和更新,又对脏数据进行标记

解法:将两个独立的线程放在一个里面

如下图:

 一起执行

评估:

放在一起会不会产生操作同一行数据,导致读写数据锁表,答案是不会的,因为新增和更新都是操作原表有的数据,而大标记是操作原表取不到的数据,两个线程不会对同一行进行操作。

结果上实现了对增量同步对物理删除数据打标,性能良好。

感谢观看

 

 

 

 

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值