我是靠谱客的博主 粗心香烟,最近开发中收集的这篇文章主要介绍使用kettle进行增量抽取数据,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

需求背景:       

        当下行业,做程序不在是一味的写增删改查了。数据汇聚、数据清洗、数据转换已成为普遍现象,本人所在的项目就是这样的一个情况。由于客户建设的系统数量多,业务分支复杂。虽同属一个主业务,但每次统筹决策查询数据时就犯难了。由于数据孤岛,关联查询成为最难解决的问题。为了解决这个问题,我需要做的就是将几十个系统数据全部汇聚在一起,方便后续的数据分析使用。

        说到数据汇聚,我们通常采用的办法就是通过ETL工具进行抽取,也有通过Oracle触发器利用dblink方法同步的,也有采用ogg(商业使用收费)的,也有利用双机热备的,总之不管哪种方法适合自己的才是最好的!我这里用的是开源免费的ETL工具 —— kettle,下面简单将自己工作中对使用kettle增量抽取的理解和流程写出来,希望能帮助到入门的猿友,也欢迎各路大神和老师们的指教!废话不多说,先上作业图:

        此作业运行环境需保证业务数据不能有物理删除情况,被删除的数据无法进行同步。且源数据表必须包含“更新时间”字段,无论新增数据还是修改数据,都要同步修改“更新时间”字段,以便我们接下来做基于“更新时间”的增量同步操作。

获取抽取状态:

        这个组件主要用来做区间段执行判断的,因为kettle里只有定点执行和间隔时间执行。

var now = new Date();
var h = now.getHours();
var m = now.getMinutes();
m = m < 10 ? '0' + m : m;
var now_time = parseInt(h + '' + m);

这里使用js脚本获取当前时间(小时和分钟,没必要精细到秒)

 区间判断,是否应该执行。 

将状态设置为变量


校验抽取状态:

        这个组件通过判断“抽取状态”变量 


检查数据库连接、数据表是否存在: 


获取目标表最大时间(更新时间): 

将目标表最大更新时间戳设置为变量


校验最大时间: 

        这个组件通过判断最大更新时间戳变量是否为空,为空时全量抽取,不为空时增量抽取。


全量抽取:

记得指定数据库字段!!!


计算源表新增数据量:

数据量大于1时返回true,否则返回false。true时进行下一步,false时不进行增量抽取。


删除目标表已更新数据:

按最大目标表更新时间先查询出源表新增数据,然后将主键合并为一行(可以用oracle中的vmsys.vm_concat),然后将主键组传给SQL脚本,删除目标表里已更新的数据。


增量抽取:

       


        以上完毕,各位猿友可以根据需求删减或增加组件。关于存在物理删除的情况,如果对数据要求准确性不严的话,建议在区间增量以外的时间段做个全量同步。或者另写个作业,先将数据全量抽取至中间表,通过Oracle差集minus关键字比对后删除目标表数据。如有问题请留言!


转载请注明原作者!

        

        

        

最后

以上就是粗心香烟为你收集整理的使用kettle进行增量抽取数据的全部内容,希望文章能够帮你解决使用kettle进行增量抽取数据所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(92)

评论列表共有 0 条评论

立即
投稿
返回
顶部