背景
工作中遇到的一个问题,场景是这样的,我们需要从A数据库通过一定的逻辑转换到B数据库,原来同事做的方式是使用了Kettle里面的一个控件,插入/更新这个控件,但是,程序上线一段时间后发现一个问题,A库的删除是物理删除,物理删除这个是万万没有想到的啊,你要是逻辑删除,那么每次我们在取数的sql里面加一个flg来判断就好了啊,只取是有效的就可以了,但是,这特么物理删除就直接懵比了,我们这个控件是不支持对删除数据的感应的啊,所以大致的问题背景就是这样的。
解决问题方式
- 第一点让我想到的就是,那就把插入更新的插件替换成表输出就可以了啊,然后配置里面改成裁剪表这样每次我们就是全量的更新这个表的数据了啊,管你什么更新删除,每次我都是最新的数据啊,但是想法往往就很好,实际就有问题,十来万条数据,你这么批量的删了,然后在插入,这段时间业务数据是一直在跑的啊,而且这么做的话,会出现生产问题
- 第二点,我就想到了Oracle里面的merge into的语法,要有这个就好了,但是Kettle是没有啊,所以就要想怎么实现呢,发现一个控件,MultiwayMergeJoin这个控件可以实现过滤不一样的数据,例如我建立了两张表,test和test1表存的数据如下图所示
test表