ETL算法--拉链表算法以及Kettle工具实现

时间:2022-12-29 12:52:29

用处:能够保存每日的余额,方便历史查询,对于数据条数较多,每日变化不多的情况非常实用。

看具体例子【转】

OD(在第一天就等于HIS)
用户标志      状态 开始时间   结束时间
1             1    200712   299901
2             2    200712   299901
3             3    200712   299901
4             4    200712   299901
5             5    200712   299901

ND
用户标志     状态  开始时间     结束时间
1             2    200801      299901
2             2    200801      299901
3             4    200801      299901
4             4    200801      299901
5             6    200801      299901

W_I=ND-OD  (  将W_I表的内容全部插入到历史表中,这些是新增记录 )
用户标志    状态   开始时间     结束时间
1             2   200801        299901
3             4   200801        299901
5             6   200801        299901

W_U=OD-ND ( 对历史表进行W_U部份的更新操作,start_date保持不变,而end_date改为当天 )
用户标志    状态  开始时间       结束时间
1            1   200712          299901
3            3   200712          299901
5            5   200712          299901

INSERT操作把I插入到HIS
用户标志   状态   开始时间        结束时间
1            1   200712           299901
2            2   200712           299901
3            3   200712           299901
4            4   200712           299901
5            5   200712           299901
1            2   200801           299901  --new
3            4   200801           299901  --new
5            6   200801           299901  --new
</span>
update操作按U更新HIS
用户标志       状态 开始时间 结束时间
1               1   200712  200801 --change
2               2   200712  299901  
3               3   200712  200801 --change
4               4   200712  299901
5               5   200712  200801 --change
1               2   200801  299901
3               4   200801  299901
5               6   200801  299901

下面为具体的KETTLE实现方式:

1、历史数据(第一次即为前一日的数据,如20180101)入库操作,将数据源导入oracle库,目标表为:2018_HIS

2、当日数据如(20180102)入库操作,目标表为:2018_NEW

3、获取当日增量数据(余额有更新或者新增的账号),存到临时表:2018_CHG

具体sql如下:

INSERT INTO 2018_CHG
SELECT  T1.ID, T1.STAT, T1.FSRQ, T1.END_DATE FROM 2018_NEW T1, 2018_HIS T2
WHERE T2.END_DATE = '99991231' AND T1.ID = T2.ID AND T1.STAT <> T2.STAT;  ------将历史表中当前有效的数据与新表对比,取出状态不同的
INSERT INTO 2018_CHG SELECT * FROM 2018_NEW WHERE ID NOT IN (SELECT ID FROM 2018_HIS);  --------新增ID入库

4、封链操作(即将历史表中状态有变化的结束时间更新为当前日期,称为失效记录)

具体sql如下

UPDATE 2018_HIS
SET 2018_HIS.END_DATE = (SELECT 2018_CHG.FSRQ FROM 2018_CHG WHERE 2018_HIS.ID = 2018_CHG.ID) WHERE 2018_HIS.ID IN (SELECT ID FROM 2018_CHG) AND 2018_HIS.END_DATE = '99991231'

5、插入操作(将变化表直接插入到历史表当中)

具体sql如下:

INSERT INTO
2018_HIS 
SELECT * FROM 2018_HIS

6、清理临时表和变化表,以备下次新数据继续使用

几点说明:

(一)具体的KETTLE例子和转的例子操作过程最后两步骤有点不同,可以参考KETTLE例子为准

(二)建表时候发生END_DATE默认都设置为‘99991218’(oracle中设置),FSRQ在导入数据时候新增文件日期列(KETTLE中入库可实现)

最后附上KETTLE的下载网址,免费开源软件:

https://sourceforge.net/projects/pentaho/files/Data%20Integration/7.0/pdi-ce-7.0.0.0-25.zip/download 

使用过程中可能出现的问题解决方法

https://www.cnblogs.com/espooky/p/6007326.html       闪退解决方法
https://www.jianshu.com/p/8930ab9af827                      闪退解决方法
http://blog.csdn.net/xyj0808xyj/article/details/46976113?locationNum=13     TXT文本导入
http://download.csdn.net/download/muyandong/207249  

http://blog.sina.com.cn/s/blog_7e04e0d00101k53d.html         无法连接数据库

附上一张本人KETTLE拉链算法流程图:

ETL算法--拉链表算法以及Kettle工具实现