KETTLE 实现三表同步的问题

来源:互联网 发布:dnf怎么老网络中断 编辑:程序博客网 时间:2024/06/05 05:25
最近根据项目需求  要求用kettle 做一个 三个数据源的 数据抽取工作
具体条件如下
现有三个数据库 test_eemp  中有表ks_actors              最后更新时间字段为  last_modify_date  ;

                          test_dbpec 有表 security_account      最后更新时间字段为   modify_date   ;
 
                          qjl_test 中有表 security_account        最后更新时间字段为     modify_date ;
   
三个表的表结构类似  其中一部分字段相同或字段意思 类似

三个表里面都有一个最后更新时间的字段  

现在要求 以ks_actors 为主表    两个分别为security_account为目标表  进行同步

同步分析:
1,主表插入数据可能为多次 多时间段  。
2,目标表中的原有数据需要保留且不能破坏 。
3,还要考虑到 假如目标表的其中一个表被破坏掉的时候,我们要确保另一个目标表可以正常更新  。
4,因为三个表不在同一个数据库中,所以我们需要拿到目标表最后更新时间字段 就不能在一条sql 语句中完成(其实大神是可以拿到的,但是对于还是菜鸟阶段的我来说 有点难度,关键在于这一步在表输入里面就算拿到了,对后面的操作也很不利 。 )所以这里我为了 让整个流程变得更加容易理解 我自己创建了另一张表  叫做targettable_last_update_time 看见名字大家就知道这个表的用意了  这个表里面只有一个字段 跟表表名一样 叫做target_table_last_update_time  里面记录的就是目标表最后一次的更新时间,这样没更新一次就把时间记录下来放到这个表里面  下次更新的开始时间就可以从这个时间开始  循环执行

这样的话,我们就以目标表的最后更新时间 modify_date来确定主表的起始更新时间
用主表的最后更新时间来跟,目标表的最后更新时间做对比  如果主表的最后更新时间大于目标表的最后更新时间则视为 主表有数据插入,那么就需要更新  (这个地方是整个程序的关键 只有理解了这一步才能继续往下走

那么接下来的事情就是sql 语句的编写了

我们接下来看看 需要用到的控件



两个表输入 里面的内容是一样的  就是用主表 ks_actors 和 targettable_last_update_time  做交叉查询,得到主表更新的起始时间

然后可以拿到需要更新的内容 拿到需要更新的内容之后 我们就可以用插入更新 控件来将拿到数据 往目标表里面放,日志 和文本文

件输出 都是可以选择的 不要也没有问题 但是在实际的项目中尽量的用日志来保存更新的纪录  以便于后面 出现问题的时候 查询记录

控件图这样做还可以避免目标表当中的一个被损坏的时候 另一个也不能正常执行


当然了 大神还有更加高明的做法  用替换变量的搞法  我目前就研究出来这个控件图 

好了  就写到这里了 希望可以帮到不少kettle的菜鸟 来实现不同数据源的数据同步问题


谨以此文来献给正苦苦挣扎在kettle基础薄弱的自己和各位菜鸟们!!!!









1 0