首先声明本人不懂Java,只是从执行结果推测Kettle的处理机制,有不对的地方,还请多多指教。
据我推测:SQL对数据的处理是批量处理的,而Kettle对数据的处理是逐行处理的。
先理解一下meger(合并)和join(连接),假设A表两个字段,B表两个字段
meger: 结果为两个字段。
join: 结果为4个字段。
下面从Kettle中的连接与合并,说明Kettle与SQL的区别。因为Kettle是逐行处理的,所以做连接前一定要根据关键字排好序。
1. Join Rows (cartesian product)
a>从多个数据源获取数据
b>指定一个主数据源,指定对主数据源的筛选条件
c>从主数据源取一条数据。如果不符合筛选条件,则丢弃;如果符合筛选条件,把其它数据源的数据循环添加到这条数据后面。
d>从主数据源取下一条数据,重复c步骤,直到主数据源数据取完。
类似SQL(Kettle执行结果与SQL是一致的)如下:
--无筛选SELECT * FROM TEST_JOIN_1 A JOIN TEST_JOIN_2 B JOIN TEST_JOIN_3 C ;
--有筛选SELECT * FROM TEST_JOIN_1 A JOIN TEST_JOIN_2 B JOIN TEST_JOIN_3 CWHERE A.ID = ‘123‘AND A.NAME = ‘Lio5n‘ ;
2. Merge Join
a>从两个数据源获取数据
b>逐行对两个数据源数据进行关联(包括:内、左、右、外关联),以关键字想等为条件。
类似SQL(Kettle执行结果与SQL是一致的)如下:
SELECT * FROM TEST_JOIN_1 A JOIN TEST_JOIN_2 B ON A.ID = B.ID ;
3. Merge Rows (diff)
a>从两个数据源获取数据
b>以一个数据源为参考(Reference)数据源,以另外外一个为合并(Compare)数据源
c>以关键字段的顺序,逐行从 Reference 和 Compare 取数据,并合并到一起,并添加标记变化(identical, delete, new)字段
d>注意:identical情况下,Compare 的非关键字段出现在结果集里
类似SQL如下(只是类似,一般情况下不是下面的结果,因为 Kettle 是按排序后的关键字逐行处理的):
SELECT A.ID ID ,A.NAME NAME ,‘deleted‘ FALGFIELD FROM TEST_JOIN_1 A LEFT JOIN TEST_JOIN_2 B ON A.ID = B.ID WHERE B.ID IS NULL UNION SELECT B.ID ID ,B.NAME NAME ,‘identical‘ FALGFIELD FROM TEST_JOIN_1 A JOIN TEST_JOIN_2 B ON A.ID = B.ID UNION SELECT B.ID ID ,B.NAME NAME ,‘new‘ FALGFIELD FROM TEST_JOIN_1 A RIGHT JOIN TEST_JOIN_2 B ON A.ID = B.ID WHERE A.ID IS NULL ;
4. Multiway Merge Join
a>从多个数据源获取数据
b>并关联(包括:内、外关联)字段相等的记录。
类似SQL(Kettle执行结果与SQL是一致的)如下:
SELECT * FROM TEST_JOIN_1 A JOIN TEST_JOIN_2 B ON A.ID = B.ID JOIN TEST_JOIN_3 C ON A.ID = C.ID ;
5. Sorted Merge
a>从多个数据源获取数据
b>根据关键字顺序分别从两个流里抽取数据
c>最终把两个流里的数据以关键字为顺序合并到一起
类似SQL(Kettle执行结果与SQL是一致的)如下:
SELECT ID, NAME FROM TEST_JOIN_1 UNION ALL SELECT ID, NAME FROM TEST_JOIN_2 UNION ALL SELECT ID, NAME FROM TEST_JOIN_3 ORDER BY ID ;
6. Append streams
a>从两个数据源获取数据
b>取出第一个流里的所有数据
c>把第二个流里的数据追加到第一个流后面
类似SQL(Kettle执行结果与SQL是一致的)如下:
SELECT ID, NAME FROM TEST_JOIN_1 UNION ALL SELECT ID, NAME FROM TEST_JOIN_2 ;
7. Prioritize streams
a>从多个数据源获取数据
b>根据指定的顺序依次追加到一个流里
类似SQL(Kettle执行结果与SQL是一致的)如下:
SELECT ID, NAME FROM TEST_JOIN_1 UNION ALL SELECT ID, NAME FROM TEST_JOIN_2 UNION ALL SELECT ID, NAME FROM TEST_JOIN_3
;