关于使用ETL工具Kettle的简单介绍(三)

来源:互联网 发布:mysql中的like语句 编辑:程序博客网 时间:2024/04/29 08:21

该篇将介绍多表关联转换的ETL流程

这里说到的多表关联转换是特指一个表的一条记录到多个表的多条记录和多个表的多条记录到一个表的一条记录。这里没有涉及横转纵和纵转横,这两种情况在最后会略做说明。

环境描述:

该业务逻辑的转换是基于一张主表、多张辅表进行设计的。比如一张股票信息表,源端中该表关于机构的仅仅包含机构编号,没有机构名称。而在目的端中该表包含有机构名称。在处理该过程中,需要将源端的股票信息表和机构信息表进行关联,这时股票信息表为主表,而机构信息表为辅表。

以上为最简单的例子,或许还有更多表的关联。基于这样的业务逻辑设计以下的流程。

设计概述:

其中会用到一个Excel模板,两张配置表:TB_TRANSCONFMORETB_ETL_ERROR_LOG

Excel模板是用来将多个表的关联关系和转换关系进行配置,然后通过VBA程序自动生成导入历史数据和增量数据转换的存储过程。

大家可以想象,如果目的端一个表是由源端三个表转换的。生成的关键语句为:

SELECT A.C1A.C2A.C3…A.CN,B.C1B.C2C.C1 FROM A

LEFT JOIN B WHERE B… ON A… = B…

LEFT JOIN C WHERE C... ON A… = C…;

当主表A有增量数据时,则需要在A表后面加上增量的条件;当辅表B和辅表C有增量数据呢?则不是简单的在B表和C表的where中加增量条件了。这种情况下面会介绍。

其中表一TB_TRANSCONFMORE是一个配置表,其中包含了源端库名、源表表名、目的端库名、目的端表名、Job组号、源端上次时间点、源端当前最大时间点、目的端装载时间点、源端是否有更新。目的端和源端的表之间是一对多的关系,而在目的表这一端的表都是唯一的,而源端的表是可以重复出现的。

表二TB_ETL_ERROR_LOG是错误日志记录表,跟上一篇的意思一样。

设计详细描述:

首先通过一个Job根据配置表中的“源端上次时间点”判断每个表是否有增量,如果有增量则把“源端是否有更新”置为1,否则为0

其次就是最主要的转换过程,当主表有更新时,则执行上面的语句,并在最后加上增量的判断条件即可。当从表有更新时,则执行以下语句(例子中以辅表B有增量):

SELECT A.C1A.C2A.C3…A.CN,B.C1B.C2C.C1 FROM B

INNER JOIN B WHERE A… ON A… = B…

LEFT JOIN C WHERE C... ON A… = C…

WHERE B.UPDATETIME > STARTTIME AND B.UPDATETIME <= ENDTIME;

这样就会把辅表对应的记录进行更新。但是语句都是通过Excel模板和VBA程序自动生成的,而且在存储过程中通过表名来判断该执行什么样的语句。

 

原创粉丝点击