对于习惯使用SQL进行工作的我,在使用Kettle进行数据同步时,首先想到的是数据库的MERGE INTO语句,这个语句也是专门用来进行数据合并的,它性能高效、简洁,可以在一个语句中完成新增、修改和删除操作。在熟悉Kettle的过程中,进行模拟该语句,也是不错的想法。
先看下最终的转换图:

相关说明:
1、由于要合并两个数据源,因此需要分别从“数据源”和“目标表”中加载数据,需要特别说明的是,由于后续“合并记录”节点会对数据进行比较,因此两个数据源需要采用一致的排序方式,否则合并后的数据会有问题。
2、字段选择:由于这里使用的是从MySQL 到 MSSQL,虽然同时bigint类型,但是映射的类型却不同(BigNumber(16)、Integer(15)),这里使用字段选择是为了将类型转换为统一的类型:

3、合并记录:设置的时候需要注意:
旧数据源 是需要目标数据表
新数据源 是合并的来源
标志字段 会跟据数据的比较结果,生成不同的标记:
deleted 在新数据源中找不到
new 在新数据源中找不到
changed 数据有变化
identical 数据无变化
匹配的关键字/字段:进行比较的字段

4、Switch / Case 会跟据不同的数据标记,将记录转发到对应的节点:
Switch 字段:与“合并记录”中的标志字段一致
Case值:可根据对应的标记进行转发

这个示例中,changed的记录并没有使用“插入 / 更新”来做,而是使用先删除,后添加的方式,这样在数据量大的情况下,性能更优。