数据抽取之采用增量时间戳的方法进行增量抽取(二)

本文主要介绍源表为多表关联时,数据增量抽取的情况。
一、抽取情况说明
将源数据库S中的A表(将此表称为源表A)以及B表(将此表称为源表B)进行关联,通过ETL工具抽取至目标数据库T的C表(将此表称为目标表C)。表结构如下图所示:
数据抽取之采用增量时间戳的方法进行增量抽取(二)
采用用增量时间戳的方式进行增量抽取,需要目标数据库T中建立一张抽取日志表LOG,来记录每次抽取的情况。
表结构如下图所示:
数据抽取之采用增量时间戳的方法进行增量抽取(二)

其中,BM字段保存的是源表的表名(字段值为A或B),同时KSSJ、JSSJ字段为保存的值为BM字段值对应的源表(A或B)中每次抽取时,根据其表(A或B)的ZHXGSJ字段进行抽取数据过滤的字段值。
二、抽取过程
1、结合源表的数据结构并确认所有源表的增量时间戳字段(A和B表的增量字段都为ZHXGSJ,即最后修改时间)。注意,时间戳字段不能为空。若为空,则不能采用此方法进行数据抽取。
2、单次抽取流程图,如下图所示:
数据抽取之采用增量时间戳的方法进行增量抽取(二)
1)、开始。
2) 、判断源表A及源表B关联的数据记录数是否为0。即在源数据库S下执行下面语句:select count(1) from A inner join B on A.ID = B.GLID。
3)、若记录数为0,则说明源表A及源表B关联的数据为空,不需要进行数据抽取,结束。
4)、若记录数不为0,则查询源表A的最后修改最大时间,即max(ZHXGSJ),将此时间记作A_JSSJ,若此时间为空,则设置默认值为1970年1月1日。即在源数据库S下执行下面语句:select max(A.ZHXGSJ) from A inner join B on A.ID = B.GLID。将此语句执行结果保存至变量A_JSSJ。
5)、查询源表B的最后修改最大时间,即max(ZHXGSJ),将此时间记作B_JSSJ,若此时间为空,则设置默认值为1970年1月1日。即在源数据库S下执行下面语句:select max(B.ZHXGSJ) from A inner join B on A.ID = B.GLID。将此语句执行结果保存至变量B_JSSJ。
6)、获取抽取日志LOG表中表名为A的距离当前时间最近的一条抽取记录,即max(JSSJ),将此时间记作A_KSSJ,若此时间为空,则设置默认值为1970年1月1日。即在目标数据库T下执行下面语句:select max(JSSJ) from LOG where BM=’A’。 将此语句执行结果保存至变量A_KSSJ。
7)、获取抽取日志LOG表中表名为B的距离当前时间最近的一条抽取记录,即max(JSSJ),将此时间记作B_KSSJ,若此时间为空,则设置默认值为1970年1月1日。即在目标数据库T下执行下面语句:select max(JSSJ) from LOG where BM=’B’。 将此语句执行结果保存至变量B_KSSJ。
8)、查询源表A的ZHXGSJ满足大于等于A_KSSJ且小于(等于)A_JSSJ或者源表B的ZHXGSJ满足大于等于B_KSSJ且小于(等于)B_JSSJ所有数据记录。即在源数据库S下执行下面语句:select A.ID||B.ID ID,A.MC A_MC,B.MC B_MC,A.ZHXGSJ A_ZHXGSJ,B.ZHXGSJ B_ZHXGSJ from A inner join B on A.ID = B.GLID where A.ZHXGSJ > =:A_KSSJ AND A.ZHXGSJ <=: A_JSSJ or B.ZHXGSJ > =:B_KSSJ AND B.ZHXGSJ <=:B_JSSJ。
9)、通过ETL等工具,将源表A及源表B中符合条件的数据记录抽取至目标表C。即根据上一步中获取的源表A及源表B中符合条件的所有数据记录,通过ETL等工具抽取至目标表C。
10)、根据A_KSSJ,A_JSSJ,插入一条记录到抽取日志表。即在目标数据库T下执行下面语句:insert into LOG(ID,BM,KSSJ,JSSJ) values (‘A’,:ID,:A_KSSJ, :A_JSSJ)。
11)、根据B_KSSJ,B_JSSJ,插入一条记录到抽取日志表。即在目标数据库T下执行下面语句:insert into LOG(ID,BM,KSSJ,JSSJ) values (‘B’,:ID,:B_KSSJ, :B_JSSJ)。
12)、结束。

注意:本流程图,只是用来说明增量抽取的原理的,实际情况,使用ETL等相关工具进行抽取流程配置的时候会有所不同。
3、设置定时任务,根据实际情况,定时执行单次抽取过程。
三、需要注意的地方
1、在实际操作中,当多个源表进行关联时候,有很多数据库工程师,并不会针对所有的源表的时间戳字段进行增量数据的过滤。他们会着重选取一些目标表中所需字段(其更改较为频繁的、较为重要的)对应的源表,根据所选取的源表的增量时间戳字段,进行增量数据的过滤。这样会造成目标表的某些数据的某些字段,跟其对应源表的字段值不一致的情况。
2、除了上述需要注意的第1点所述的情况外,理论上,根据此方法进行抽取,源表A和目标表A,无论是数量还是每条数据记录上都理应是完全一致的。要注意的是,这仅仅是理论上,实际情况中,会有多种原因造成源表A和目标表A,存在不一致的情况。在这不做讨论,后面的有文章会专门讨论,出现这种情况的原因。