以连接为例 说明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 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
时间: 2024-10-26 10:30:02

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

Kettle实现SQL Server数据到GreenPlum的每日同步调度

1.总的调度流程,通过linux下的crontab定时执行一个包含kjb执行信息的shell脚本 2.XXXX_0_Execute_Judge转换下有两个作业,通过获取每天的同步状态值来判断是否执行同步工作,如果同步状态不满足,会发邮件告知 3.XXXX_A0_Connect_Next作业下含有四个并行执行的作业,Message_Prepare_Yes作业负责的获取到同步状态OK的Email邮件通知 4.四个并行执行的作业分别负责同步不同的模块数据(整个同步原则是小表直接同步,大表通过BCP导出

SQL 连接 JOIN 例解。(左连接,右连接,全连接,内连接,交叉连接,自连接)

SQL 连接 JOIN 例解.(左连接,右连接,全连接,内连接,交叉连接,自连接) 最近公司在招人,同事问了几个自认为数据库可以的应聘者关于库连接的问题,回答不尽理想-现在在这写写关于它们的作用假设有如下表: 一个为投票主表,一个为投票者信息表-记录投票人IP及对应投票类型,左右连接实际说是我们联合查询的结果以哪个表为准-1:如右接连 right join 或 right outer join:我们以右边voter表为准,则左表(voteMaster)中的记录只有当其ID在右边(voter)中存

ASP.NET MVC 5 - 创建连接字符串(Connection String)并使用SQL Server LocalDB

原文:ASP.NET MVC 5 - 创建连接字符串(Connection String)并使用SQL Server LocalDB 您创建的MovieDBContext类负责处理连接到数据库,并将Movie对象映射到数据库记录的任务中.你可能会问一个问题,如何指定它将连接到数据库? 实际上,确实没有指定要使用的数据库,Entity Framework将预设值使用的LocalDB. 在本节中,我们将显式地在Web.config文件中,添加应用程序的连接字符串(connection string)

[转]ASP.NET MVC 5 - 创建连接字符串(Connection String)并使用SQL Server LocalDB

您创建的MovieDBContext类负责处理连接到数据库,并将Movie对象映射到数据库记录的任务中.你可能会问一个问题,如何指定它将连接到数据库? 实际上,确实没有指定要使用的数据库,Entity Framework将预设值使用的LocalDB. 在本节中,我们将显式地在Web.config文件中,添加应用程序的连接字符串(connection string). SQL Server Express LocalDB LocalDB的是一个SQL Server Express轻量级版本的数据库

sql表连接left join,right join,inner join三者之间的区别

sql表连接left join,right join,inner join区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 (以左表数据为基准,不足补为NULL)right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录(以右表数据为基准,不足补为NULL)inner join(等值连接) 只返回两个表中联结字段相等的行(条件on之相等的数据) 举例如下: ---------------------------------------

从多表连接后的select count(*)看待SQL优化

从多表连接后的select count(*)看待SQL优化 一朋友问我,以下这SQL能直接改写成select count(*) from a吗? SELECT COUNT(*) FROM a LEFT JOIN b ON a.a1 = b.b1 LEFT JOIN c ON b.b1 = c.c1 废话不多说,直接上实验. 1. 准备数据 创建测试表a,b,c,并插入数据,a有重复数据,b是唯一数据,c是唯一数据,d有重复数据. 1) 创建a表 create table a (a1 int);

一行导出所有任意微软SQL server数据脚本-基于Python的微软官方mssql-scripter工具使用全讲解

文章标题: 一行导出所有任意微软SQL server数据脚本-基于Python的微软官方mssql-scripter工具使用全讲解关键字 : mssql-scripter,SQL Server文章分类: 技术分享 创建时间: 2020年3月30日 _.-"\ _.-" \ ,-" \ \ \ \ \Zoomla逐浪CMS\ \ \ web开发秘笈\ \ \ \ z01.com _.-; \ \ _.-" : \ \,-" _.-" \( _.-&

MySQL 之 导入外部SQL Server数据

在上一篇博客<MySQL 之 5.6.22安装教程>中,我们介绍了MySQL的安装.今天我们主要讲解一下怎么在MySQL中导入外部SQL Server数据,简而言之就是我们怎么将SQL Server数据库中的数据迁移到MySQL数据库中. 为了实现我们想要的数据迁移,我们首先需要下载一个小工具SQLyog,然后安装到我们的电脑上,接下来我们就一步一步用这个小工具开始我们的数据迁移: 首先看看我们SQL Server数据库中的表结构和表中的数据 打开SQLyog,设置数据连接: 创建跟SQL S

20150221&mdash;LINQ to SQL 查询数据

LINQ to SQL 可以快捷的查询基于SQL的数据,直接在VS中包括基本的Object/relation映射器,O/R映射器可以快速的将基于SQL的数据源映射为CLR对象,之后就可以使用LINQ查询. 如下图中,在项目中右键添加--新建项,找到LINQ to SQL类 然后创建新连接,点击连接到数据库: 添加连接 在左侧的服务管理资源中找到需要添加的连接名,表名 将表拖拽到DataClasses1,点击 是 根据需要将需要的表拖拽进来: 拥有主外键关系的表会在其之间有一条虚线.   使用LI