之前的业务需求是实现数据的增量同步,具体描述为:新增数据插入,变化数据更新(增改),我使用 表输入+插入更新控件 即可实现。

现在业务提出新的需求:除前面描述外,还要实现源表数据删除时,目标表数据同样删除。
虽然我极其不推荐这样做,原因有三:
            (1)数据库不应该真正存在delete操作,如果确实要删除一条数据的话,理论上应该在数据库中设置标志位,执行update,不向前端业务显示,但数据仍存在数据库中,便于追溯和回退;
            (2)ETL实现删除数据的操作,一旦出现问题,很难查找和解释原因,容易出现互相扯皮和推诿现象;
            (3)我需要重新开发ETL。虽然个人难以接受,奈何业务需求是天,我也得硬着头皮去完成,之后可能发生的事情,只能“走一步看一步”,听天由命了。记录关键过程如下:

 

1.   转换的核心对象共4个,包括2个输入、1个合并记录和1个数据同步。文本文件输出是为了看合并记录结果的。源数据和目标数据必须为同样结构的表。

     下图实现功能:将目标数据表的数据同步到源数据表。两者数据最终完全一样。

     实现原理:比较源表和目标表的行数据,然后生成合并表,数据同步控件根据合并表的结果,将最新的数据同步到源数据表。和源数据表相比,目标数据表新增的数据新增到源数据表,目标数据表删除的在源数表删除,目标数据表修改的在源数据表修改,目标数据表没有变化的数据在源数据表不进行改变。最终结果是

【表输入在输入中找:合并记录在链接中;数据同步在输出中】分别设置源数据和目标数据,其中记录数量限制为0就是全部同步。
       

 

2.合并记录设置。新数据源的数据同步到旧数据源。旧数据源是要被数据同步控件覆盖的数据,也就是数据同步控件的目标表;根据新数据源数据和旧数据源的比较是否有增删改查来给标志位赋值。标志字段随便起名即可(要符合命名规范)。“”匹配的关键字”最好是主键(唯一值勉强也行),数据字段是要同步的列(注意,一定要包括关键字段,否则目标数据该列就是空值,千万注意!!)。如下图:

 

3.合并结果如下。合并源数据表和目标数据表的所有行数据,然后每行加入标志字段。表示字段的值deleted、changed、identical、new。这些值和下面的数据同步控件高级选项填写的值必须一样。

 

4.合并完成后,标志字段的值有4种,分别是:

Identical” : 关键字段在新旧数据源中都存在,且域值相同

“changed” : 关键字段在新旧数据源中都存在,但域值不同

new” :  旧数据源中没有找到该关键字段

deleted”:  新数据源中没有找到关键字段

 

5.数据同步的配置需要注意以下几点:

(1)  不论是查询的关键字,还是更新字段,都不要写标志字段;其他字段根据业务需求,进行设置;

(2)  高级标签中的规则要定义好,否则会报“It was not possible to find operation field [null] in the input stream!”错误。

(3)  此处设置的数据表必须为源数据表。数据同步控件根据合并记录控件输出的合并表的标志位的值,来决定哪些行的数据需要输出到源数据表。new的数据新增到源数据表,changed的数据更新,deleted的数据删除,indentical的数据不进行改变。

下图中的值必须是new、changed、deleted,和合并记录控件输出的合并结果中的标志位的值一样。数据同步控件根据此处设置的值来和合并结果标志位的值进行比较,来判断每行数据的增删改查。

5.根据需要是定时操作,还是手工操作,如果定时的话,重新建个作业,设定开始相关的配置即可。

另外需要强调一下,如果源数据和目标数据字段不一样的话,来源数据可以用as来改变列名,并一定注意名称和列顺序一致。

 

6.保存作业到本地。可以将保存的作业上传到linux系统、windows系统上定时运行。 

参考:Kettle之数据同步

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐