充值信息

赞助信息

推荐给好友 上一篇 | 下一篇

ETL中的数据增量抽取机制研究



0 引 言

    增量抽取是数据仓库ETL(extraction,transformation,loading,数据的抽取、转换和装载)实施过程中需要重点考虑的问题。在ETL过程中,增量更新的效率和可行性是决定ETL实施成败的关键问题之一,ETL中的增量更新机制比较复杂,采用何种机制往往取决于源数据系统的类型以及对增量更新性能的要求。本文不就某个ETL增量抽取的具体机制作深入探讨,重点对各种方法进行对比分析,从而总结各种机制的使用条件和优劣性,为数据仓库项目中ETL工程的实施提供增量抽取技术选型方面的参考。

1 ETL概述

    ETL包括数据的抽取、转换、加载。①数据抽取:从源数据源系统抽取目的数据源系统需要的数据:②数据转换:将从源数据源获取的数据按照业务需求,转换成目的数据源要求的形式,并对错误、不一致的数据进行清洗和加工;③数据加载:将转换后的数据装载到目的数据源。

    ETL作为构建数据仓库的一个环节,负责将分布的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后进行清洗、转换、集成,最后加载到数据仓库或数据集市中,成为联机分析处理、数据挖掘的基础。ETL原来主要用户构建数据仓库和商业智能项目,现在也越来越多地应用于一般信息系统数据的迁移、交换和同步。

    在ETL的3个环节中,数据抽取直接面对各种分散、异构的数据源,如何保证稳定高效的从这些数据源中提取正确的数据,是ETL设计和实施过程中需要考虑的关键问题之一。

    在集成端进行数据的初始化时,一般需要将数据源端的全部数据装载进来,这时需要进行全量抽取。全量抽取类似于数据迁移或数据复制,它将数据源中的表或视图的数据全部从数据库中抽取出来,再进行后续的转换和加载操作。全量抽取可以使用数据复制、导入或者备份的方式完成,实现机制比较简单。

    全量抽取完成后,后续的抽取操作只需抽取自上次抽取以来表中新增或修改的数据,这就是增量抽取。

    在数据库仓库中,无论是全量抽取还是增量抽取,抽取工作一般由数据仓库工具来完成,如oracle的OWB,Sql Server的Integration Services以及专业的ETL商业产品Informatica PowvrCenter等。如果企业的预算有限,也可以考虑使用开源项目Pentaho。这些工具都有一个特点,就是本身并没有实现特定的增量抽取机制,它们完成全量抽取后,用户可以通过定制计划任务的方式,实现按一定的周期从源系统中抽取当前周期内产生的增量数据,但至于这些增量数据如何产生,工具并没有提供自动生成增量数据的功能。所以,ETL过程中增量数据的产生机制是一个需要用户重点研究和选择的问题。下面讨论各种增量抽取的实现机制原理。

2 增量抽取机制

    要实现增量抽取,关键是如何准确快速的捕获变化的数据。优秀的增量抽取机制要求ETL能够将业务系统中的变化数据按一定的频率准确地捕获到,同时不能对业务系统造成太大的压力,影响现有业务。相对全量抽取而言,增量抽取的设计更复杂,有一种将全量抽取过程自动转换为增量抽取过程的ETL设计思路,前提是必须捕获变化的数据,增量数据抽取中常用的捕获变化数据的方法有以下几种:

    2.1 触发器方式

    触发器方式是普遍采取的一种增量抽取机制。该方式是根据抽取要求,在要被抽取的源表上建立插入、修改、删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个增量日志表,ETL的增量抽取则是从增量日志表中而不是直接在源表中抽取数据,同时增量日志表中抽取过的数据要及时被标记或删除。

    为了简单起见,增量日志表一般不存储增量数据的所有字段信息,而只是存储源表名称、更新的关键字值和更新操作类型(knsen、update或delete),ETL增量抽取进程首先根据源表名称和更新的关键字值,从源表中提取对应的完整记录,再根据更新操作类型,对目标表进行相应的处理。

    例如,对于源表为Oracle类型的数据库,采用触发器方式进行增量数据捕获的过程如下:

    (1)创建增量日志表DML LOG:

    create table DML_LOG(
    ID NUMBER primary key,//自增主键
    TABLE_NAME VARCHAR2(200),//源表名称
    RECORD_ID NUMBER,//源表增量记录的主键值
    DML_TYPE CHAR(1),//增量类型,I表示新增;U表示更新;D表示删除
    EXECUTE DATE DATE //发生时间
    );

    (2)为DML_LOG创建一个序列SEQ_DML_LOG,以便触发器写增量日志表时生成ID值。

    (3)针对要监听的每一张表,创建一个触发器,例如对表Test创建触发器如下:

    create Or replace trigger T BEFORE INSERT OR UPDATE ORDELETEONTforeach row
    declare 1 dml type varchar2(1);
    begin
    if INSERTING then l_dml type:=‘I’;
    elsif UPDATING then I_dml_type:=‘U’;
    elsif DELETING then l_dml_type:=‘D’;
    end if;
    if DELETING then
    insert into DML_LOG(ID,TABLE_NAME,RECORD_ID,EXECUTE_DATE,DML_TYPE)
    values(seq_dml_log.nextval,‘Test,:old.ID,sysdate,l_dml_type);
    else
    insert into DML_LOG(ID,TABLE_NAME,RECORD_ID,EXECUTE_DATE,DML_TYPE)
    values(seq_dml_log.nextval,‘Test’,:new.ID,sysdate,l_dml_type);
    end if;
    end;

    这样,对表T的所有DML操作就记录在增量日志表DML_LOG中,注意增量日志表中并没有完全记录增量数据本身,只是记录了增量数据的来源。进行增量ETL时,只需要根据增量日志表中的记录情况,反查源表得到真正的增量数据。

31/3123>


 

评分:0

我来说两句