Kettle学习(4):Kettle取差集数据类似oracle的minus

背景
工作中遇到的一个问题,场景是这样的,我们需要从A数据库通过一定的逻辑转换到B数据库,原来同事做的方式是使用了Kettle里面的一个控件,插入/更新这个控件,但是,程序上线一段时间后发现一个问题,A库的删除是物理删除,物理删除这个是万万没有想到的啊,你要是逻辑删除,那么每次我们在取数的sql里面加一个flg来判断就好了啊,只取是有效的就可以了,但是,这特么物理删除就直接懵比了,我们这个控件是不支持对删除数据的感应的啊,所以大致的问题背景就是这样的。

解决问题方式

  1. 第一点让我想到的就是,那就把插入更新的插件替换成表输出就可以了啊,然后配置里面改成裁剪表这样每次我们就是全量的更新这个表的数据了啊,管你什么更新删除,每次我都是最新的数据啊,但是想法往往就很好,实际就有问题,十来万条数据,你这么批量的删了,然后在插入,这段时间业务数据是一直在跑的啊,而且这么做的话,会出现生产问题
  2. 第二点,我就想到了Oracle里面的merge into的语法,要有这个就好了,但是Kettle是没有啊,所以就要想怎么实现呢,发现一个控件,MultiwayMergeJoin这个控件可以实现过滤不一样的数据,例如我建立了两张表,test和test1表存的数据如下图所示

test表
在这里插入图片描述
test1表
在这里插入图片描述
可以看出来,
test比test1多的数据就是16,17,18,
test1比test多的数据就是12,13
然后我们通过Kettle编写ktr脚本来过滤一下
首先就是两个表输入
在这里插入图片描述
这里画了红色框的位置,可以看到进行了排序,如果你抽数的表也要按照这样的关键字段进行排序,因为空间mergejoin就是要排序才可以的哦,

接下来,编写控件mergejoin
在这里插入图片描述
在输入的两个表示需要注意的,这里根据Kettle的版本的不同,这个空间有的jointype也是不一样的,7.0版本只有inner和fullouter两种连接但是,我测了一下,是可以实现只看另一个表多出来的数据的,因为还有后面的过滤控件,记住这里的字段要选你的表的关键字段来进行对比的
接下来是过滤插件的编写
在这里插入图片描述
过滤控件的记录是要有两个输出的,一个是正确的,一个是不错误的,这里,我选了两个获取字段的控件,然后分别获取,输出的字段

在这里插入图片描述

然后将获取的字段输出到文件当中,看看输出的数据是不是差集数据

在这里插入图片描述
运行一下看看结果

在这里插入图片描述
可以看到这个多出来的数据就是,test比test1多的数据,然后我们在把mergeinto里面的两个表换一下位置,在跑一次看看这个数据是什么样的

在这里插入图片描述
这就是比test1比test多的12,13数据,所以我们可以通过这两个插件来得到两个输入流的数据差集,并通过两个位置的调换,可以很好的找到谁比谁多的数据,有了这几个,我们接下来就可以通过sql脚本删除数据了,这个在接下来的篇章讲解

猜你喜欢

转载自blog.csdn.net/lovePaul77/article/details/90552256