kettle删除指定数据

来源:互联网 发布:windows phone10更新 编辑:程序博客网 时间:2024/05/17 04:17

kettl进行无效数据的删除

需求来源

需求是这样产生的,因为我要对一张生产库中的表进行增量抽取,抽取方法是通过表中的modify字段来进行增量的,每天根据这个字段获取前一天的数据。但是这样做存在一个问题,就是如果此表发生了记录的物理删除,那么我是无法感知的,所以同步后的表中存在大量已经被删除的无效数据,使数据与源表不一致,所以,需要一种方法来删除这部分不一致的数据。

设计思路

如果要解决以上问题,则需要一种方式来获取这部分无效数据,由于源表没有记录这部分信息,所以很难通过直接的手段来区分那些数据已经无效了。所以我们采用的方式是:首先,通过modify时间获取源表30天的数据,为了减小传输,只获取主键字段。然后,与已经存在的结果表进行对比,找出在结果表中存在而在源表中不存在的那些数据,此部分数据为无效数据。最后删除这部分数据。其实理论上应该对源表所有日期内的数据进行对比,但是为了减小压力,只对近30天的数据进行对比。这样虽然存在少量不一致,但是对于我们的需求已经满足了。下面具体说明一下kettle里面如何实现的。

实现方法

如图所示,首先同步30天内的源表主键,然后执行sql中的操作。由于sql需要等前面的数据同步完成后才可以进行操作,不然可能导致数据缺少,所以需要添加Block this step until steps finish模块进行控制。sql中的内容如下所示。这样就可以实现删除无效数据的要求了。
这里写图片描述

delete a from dwpdata.${schema}_${name} aleft join dwsdata.del_${schema}_${name} bon a.${key} = b.${key}where a.modifydate >= '${begin_date}'and b.${key} is null;

总结

这个方法并不是最好的,但是在实际ETL项目中确经常出现,因为业务系统自身有其复杂的设设考虑,不能完全适应ETL抽取的要求,主要就包括增量时间戳、删除数据通知这些问题。但是除了昂贵的数据库同步工具外。真的没有什么好用的方式。所以本文说明的方法还是有一定应用场景的。

0 0
原创粉丝点击