使用kettle进行增量抽取数据

1.转自: https://blog.csdn.net/fangdengfu123/article/details/69229377

2. kettle——(3)全量抽取和增量抽取: https://blog.csdn.net/jack_yangying/article/details/78064411

3. kettle增量抽取框架: https://blog.csdn.net/a275838263/article/details/51539643

4. 使用Kettle实现数据实时增量同步: https://blog.csdn.net/dora_310/article/details/80511793

5. kettle入门(七) 之kettle增量方案(一)全量比对取增量-根据唯一标示:  https://blog.csdn.net/xiaohai798/article/details/45364561

6. 数据清洗小记(11):Kettle_利用设置变量实现数据增量(小例): https://www.2cto.com/database/201510/447072.html

7. Kettle使用时间戳增量抽取数据: https://blog.csdn.net/aganliang/article/details/84995294

8. kettle实现主从表增量迁移示例: https://ainidehsj.iteye.com/blog/1746913

版权声明:学习中。。。    https://blog.csdn.net/fangdengfu123/article/details/69229377
使用背景: 
当前项目中使用的数据依赖于其它系统,别人的系统当然不会把实时更新的数据一个不差的发送给我们(当然更加不会让我们对他们系统的数据库进行编程),所以我们要自己动手去获取他们系统中的数据。

使用工具: 
kettle

扫描二维码关注公众号,回复: 6134716 查看本文章

首先需要考虑的问题是不可能是全量进行数据的拷贝,数据量如此庞大! 
那么就得考虑增量,何为增量去百度。。哈哈哈

至于如何增量抽取数据,有很多种办法,我这里示范的是通过时间去增量抽取(因为刚好别人的库中每条记录的时间记录的都相当详细,所以我认为这个比较好)。

首先创建好实例库:

SQL> desc timejob;
Name      Type         Nullable Default Comments 
--------- ------------ -------- ------- -------- 
UUID      VARCHAR2(36) Y                         
BEGINTIME DATE         Y                         

SQL> desc timejob_bak;
Name      Type         Nullable Default Comments 
--------- ------------ -------- ------- -------- 
UUID      VARCHAR2(36) Y                         
BEGINTIME DATE         Y                         

kettle中有自动生成UUID的功能,所以直接拿过来耍,为了简洁方便,字段使用比较少。 
首先利用kettle自动生成测试数据: 
 
 
主要生成UUID和当前系统时间到timejob表中(每隔2s执行一次),我们后续的操作都是对这张表中的数据进行一个备份。

下面第二步就是抽取该表中的数据到一个备份表中,timejob_bak。 
 
 
这里由于是我第一次操作,比较简单,就直接上图了。。

获得上次操作时间和系统时间存到变量中: 
 
这里的开始时间是通过表数据选项获得上一次操作的最终结束时间,以作为我此次增量抽取的开始时间。第二个变量是获得系统的当前时间。

根据时间抽取timejob表中的数据: 
 
获取变量的写法: 

此处获取的变量就是上一步存入的变量,下面的抽取增量数据就是一个sql,从timejob表中抽取数据,存数据就是一个表输出。 
抽取数据sql:

SELECT
  UUID
, BEGINTIME
FROM TIMEJOB
where begintime > to_date(substr('${endtime}',1,19),'yyyy-mm-dd hh24:mi:ss')
and begintime <= to_date(substr('${sysdate}',1,19),'yyyy-mm-dd hh24:mi:ss')

在这个表输入功能里面有个注意点: 
 
必须将替换sql语句变量打钩,否则变量无法识别。 
表输出就没什么可以写的了。

最后一个操作就是记录本次的操作时间的相关记录。

附上连跑半个多小时的数据记录: 
 
 
 
看结果可知存在遗漏抽取(后来清空数据又跑了一次,发现随着时间的增长,两张表中数据量的差距越来越大),所以想法子查找出原因,就要考虑到底是什么问题。

由于sql比较简单,因此不会出现sql的问题,数据也没有胡乱试的增长(刚开始玩kettle的时候,我把第二大步骤的三个转换写在一个转换里面,数据总是炸),所以就考虑唯一能够存在的问题:时间。。

因为生成数据是2s一次,而数据抽取是6s一次,就要考虑是不是在每隔6s的时间点上,数据录入了,但是没有被抽取作业给读取到,但是当前时间段已经跳过去了,造成了数据遗漏,进库测试下。 
胡乱写个sql测试下: 


根据之前的测试数据量测试结果: 
841 - 678 = 163.。。。。 
结果跟测试的数据量刚好吻合,说明我们的猜想是正确的,那么就要考虑如何解决这个问题。 
如果按照两个作业时间间隔的最小公倍数计算,我怎么设置时间都是有可能出现这种情况的,wtf!!!!

那么想法子改sql,之前的sql是每一次任务读取的是上一次任务结束到当前时间(包括当前时间),如果我想法子把当前时间产生的数据留到下一次读取是否可行?let’s do it。

改sql我就不贴了,清空测试数据直接开跑: 
 
 
跑了将近20分钟的结果,数据一个不漏,很好很强大。。。

项目试运行的时候,客户说kettle会莫名的自动关闭,哎!有哪位大神懂的路过指导下吧。。。不胜感激,谢谢

贴个大神的整理帖子: 
http://www.cnblogs.com/jifeng/p/4741498.html
--------------------- 
作者:fangdengfu123 
来源:CSDN 
原文:https://blog.csdn.net/fangdengfu123/article/details/69229377 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_36688928/article/details/89486185