以连接为例 说明Kettle和SQL处理数据的区别

首先声明本人不懂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 C
WHERE
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

 

转载于:https://www.cnblogs.com/wanggs/p/5116111.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值