zoukankan      html  css  js  c++  java
  • 以连接为例 说明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
    ; 
  • 相关阅读:
    Altium Designer中各层的含义
    国外现在有哪些众筹网站呢?
    C# 代码 手工 配置 Log4Net 2种方法
    Windows 7 里进程管理器里面的各列是什么含义?主要是和内存有关的内存-专用工作集,内存-工作集,内存-提交大小???
    C# .Net 下 x86使用大内存的处理
    CV学习日志:CV开发之关联Gazebo/Webots/ROS2
    CV学习日志:CV开发之Windows10环境搭建
    CV学习日志:CV开发之Ubuntu2004和WLS2环境搭建
    ROS2学习日志:ROS2Cartgrapher使用与调试
    ROS2学习日志:QoS要点总结
  • 原文地址:https://www.cnblogs.com/wanggs/p/5116111.html
Copyright © 2011-2022 走看看