ETL简介

 

ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)

信息是现代企业的重要资源,是企业运用科学管理、决策分析的基础。目前,大多数企业花费大量的资金和时间来构建联机事务处理OLTP的业务系统和办公自动化系统,用来记录事务处理的各种相关数据。据统计,数据量每23年时间就会成倍增长,这些数据蕴含着巨大的商业价值,而企业所关注的通常只占在总数据量的2%4%左右。因此,企业仍然没有最大化地利用已存在的数据资源,以致于浪费了更多的时间和资金,也失去制定关键商业决策的最佳契机。于是,企业如何通过各种技术手段,并把数据转换为信息、知识,已经成了提高其核心竞争力的主要瓶颈。而ETL则是主要的一个技术手段。

ETL(Extract-Transform-Load的缩写,即数据抽取、转换、装载的过程)作为BI/DWBusiness Intelligence)的核心和灵魂,能够按照统一的规则集成并提高数据的价值,是负责完成数据从数据源向目标数据仓库转化的过程,是实施数据仓库的重要步骤。如果说数据仓库的模型设计是一座大厦的设计蓝图,数据是砖瓦的话,那么ETL就是建设大厦的过程。

 

 

ETL体系结构图

 

 

一、      准备工作

1确定源数据范围,包括确定数据的来源、存储方式、数据结构、数据量大小、数据增长情况、数据更新频率。

2)探查源系统数据质量发现数据质量问题,以便针对具体问题,在数据进入数据仓库之前提出修正方法

二、      数据抽取

全量抽取:全量抽取类似于数据迁移或数据复制,它将数据源中的表或视图的数据原封不动的从数据库中抽取出来,并转换成自己的ETL工具可以识别的格式。全量抽取比较简单.

增量抽取:增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据。在ETL使用过程中。增量抽取较全量抽取应用更广。如何捕获变化的数据是增量抽取的关键。对捕获方法一般有两点要求:准确性,能够将业务系统中的变化数据按一定的频率准确地捕获到; 性能,不能对业务系统造成太大的压力,影响现有业务。

ETL处理的数据源除了关系数据库外,还可能是文件,例如txt文件、excel文件、xml文件等。对文件数据的抽取一般是进行全量抽取,一次抽取前可保存文件的时间戳或计算文件的MD5校验码,下次抽取时进行比对,如果相同则可忽略本次抽取

为什么要全量抽取?

l     对历史数据进行抽取;

为什么要增量抽取?

l        表数据量大时,每次全抽数据量太大

l     为了记录数据的历史变化情况;

 

增量数据抽取时,变化数据捕获是主要技术环节。

                             变化数据捕获方法

各种捕获方法对比:

触发器:

    在要抽取的表上建立需要的触发器,一般要建立插入、修改、删除三个触发器,

每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个临时表,

抽取线程从临时表中抽取数据,临时表中抽取过的数据被标记或删除。

优点:数据抽取性的能比较高

缺点:要求业务表建立触发器,对业务有一定影响

时间戳:

    它是一种基于快照比较的变化数据捕获方式,在源表上增加一个时间戳字段,系统中更新修

改表数据的时候,同时修改时间戳字段的值。当进行数据抽取时,通过比较系统时间与时间

戳字段的值来决定抽取哪些数据。有的数据库的时间戳支持自动更新,即表的其它字段的数

据发生改变时,自动更新时间戳字段的值。有的数据库不支持时间戳的自动更新,这就要求

业务系统在更新业务数据时,手工更新时间戳字段。

优点:数据抽取性的能比较高

缺点:

1)对业务系统有侵入性(加入了额外的时间戳)

2)对于不支持时间戳自动更新的数据库,有额外的更新时间戳的操作;

3无法捕获以前数据的delete,update等操作,数据准确性有一定限制;

全表比对

典型的全表比对的方式是采用MD5校验码。ETL工具事先为要抽取的表建立一个结构类似的MD5临时表,该临时表记录源表主键以及根据所有字段的数据计算出来的MD5校验码。每次

进行数据抽取时,对源表和MD5临时表进行MD5校验码的比对,从而决定源表中的数据是新

增、修改还是删除,同时更新MD5校验码。

优点:对业务系统的侵入性小

缺点:

    1性能较差

    2)当表中没有主键或唯一列且含有重复记录时,MD5方式的准确性较差

CDC

    通过分析数据库自身的日志来判断变化的数据。Oracle的改变数据捕获(CDC)技术是这

方面的代表。CDC 特性是在Oracle9i数据库中引入的。CDC能够帮助你识别从上次抽取之

后发生变化的数据。利用CDC,在对源表进行insertupdate delete等操作的同时就可以

提取数据,并且变化的数据被保存在数据库的变化表中。这样就可以捕获发生变化的数据

,然后利用数据库视图以一种可控的方式提供给目标系统。CDC分为同步模式和异步模式,

同步模式实时的捕获变化数据并存储到变化表中。异步模式则是基于Oracle的流复制技术。

优点:

1)    对于抽取性能比较高

2)    对于异步方式,采用的是日志传输,对业务系统侵入性小

缺点:

1) 对于同步方式,对源业务系统压力比较大;

2) 创建ORACLE CDC时,需要申请大量权限,需要DBA同意;

3) 对于异步方式的CDC,由于采用的是日志分析方式,一旦数据库日志满了或日志被DBA删掉,则变化数据就捕获不到了。

MINUS

对于拥有集合运算函数数据库例如oracle拥有minus,可以根据一些主键做集合运算,将差异结果存到单独的表中供其它程序读取。

优点:能够很方便的捕获到变化的数据

缺点:当数据量很大时,性能较低。

抽取技巧:

三、  数据清洗与转换

数据清洗是为了解决抽取出来的数据质量不高的问题,如:

1.数据不完整。这种情况比较多,例如记录的缺失、字段信息的缺失、记录不完整等。最明显的例子就是用户入网登记的证件号码没有输入到系统。
    2.
数据不一致。这种情况主要指由于系统之间或者功能模块之间记录不一致、编码不一致、引用不一致等。例如在97系统、计费系统、网管系统中由于业务受理处理流程不规范,或者系统之间同步时间不一致导致了不同系统中用户记录数不一致。
    3.
数据有错误。这种情况主要是指数据中存在各种不合法的情况,例如数据类型错误、数据范围越界、数据违反业务规则等。
除了第三种情况是明显的数据错误之外,其他两种都不能简单地认为是错误,这两种情况在数据仓库建设中是比较普遍遇到的,关键是对数据质量的状况有深入的认识,在应用上加以注意。

数据清洗方法:

1)手工实现方式:用人工来检测所有的错误并改正。这只能针对小数据量的数据源。

2)专门编写的应用程序:通过编写程序检测/改正错误。但通常数据清洗是一个反复进行的过程,清理程序复杂、系统工作量大。

3)运用数据清洗工具:某类特定应用领域的问题,如根据概率统计学原理查找数值异常的记录。

4)与特定应用领域无关的数据清洗:这一部分应用非常有限,主要集中于重复记录的检测/删除。

数据清洗的一部分工作是通过数据转换来完成的

l      数据不一致

l      数据粒度

l      业务规则的计算

大小交,这种处理在数据清洗过程是常见了,例如从数据源到ODS阶段,如果数据仓库采用维度建模,而且维度基本采用代理键的话,必然存在代码到 此键值的转换。如果用SQL实现,必然需要将一个大表和一堆小表都Join起来,当然如果使用ETL 工具的话,一般都是先将小表读入内存中再处理。这种情况,输出数据的粒度和大表一样。

大大交,大表和大表之间关联也是一个重要的课题,当然其中要有一个主表,在逻辑上,应当是主表Left Join辅表。大表之间的关联存在最大的问题就是性能和稳定性,对于海量数据来说,必须有优化的方法来处理他们的关联,另外,对于大数据的处理无疑会占用 太多的系统资源,出错的几率非常大,如何做到有效错误恢复也是个问题。对于这种情况,我们建议还是尽量将大表拆分成适度的稍小一点的表,形成大小交的类 型。这类情况的输出数据粒度和主表一样。

站着进来,躺着出去。事务系统中为了提高系统灵活性和扩展性,很多信息放在代码表中维护,所以它的事实表就是一种窄表,而在数据仓库中,通 常要进行宽化,从行变成列,所以称这种处理情况叫做站着进来,躺着出去。大家对Decode肯定不陌生,这是进行宽表化常见的手段之一。窄表变宽表的 过程主要体现在对窄表中那个代码字段的操作。这种情况,窄表是输入,宽表是输出,宽表的粒度必定要比窄表粗一些,就粗在那个代码字段上。

聚集。数据仓库中重要的任务就是沉淀数据,聚集是必不可少的操作,它是粗化数据粒度的过程。聚集本身其实很简单,就是类似SQLGroup by的操作,选取特定字段(维度),对度量字段再使用某种聚集函数。但是对于大数据量情况下,聚集算法的优化仍是探究的一个课题。例如是直接使用SQL Group by,还是先排序,在处理。

直接映射,原来是什么就是什么,原封不动照搬过来,对这样的规则,如果数据源字段和目标字段长度或精度不符,需要特别注意看是否真的可以直接映射还是需要做一些简单运算。

字段运算,数据源的一个或多个字段进行数学运算得到的目标字段,这种规则一般对数值型字段而言。

参照转换,在转换中通常要用数据源的一个或多个字段作为Key,去一个关联数组中去搜索特定值,而且应该只能得到唯一值。这个关联数组使用Hash算法实现是比较合适也是最常见的,在整个ETL开始之前,它就装入内存,对性能提高的帮助非常大。

字符串处理,从数据源某个字符串字段中经常可以获取特定信息,例如身份证号。而且,经常会有数值型值以字符串形式体现。对字符串的操作通常有类型转换、字符串截取等。但是由于字符类型字段的随意性也造成了脏数据的隐患,所以在处理这种规则的时候,一定要加上异常处理。

空值判断,对于空值的处理是数据仓库中一个常见问题,是将它作为脏数据还是作为特定一种维成员?这恐怕还要看应用的情况,也是需要进一步探求 的。但是无论怎样,对于可能有NULL值的字段,不要采用直接映射的规则类型,必须对空值进行判断,目前我们的建议是将它转换成特定的值。

日期转换,在数据仓库中日期值一般都会有特定的,不同于日期类型值的表示方法,例如使用8位整型20040801表示日期。而在数据源中,这种字段基本都是日期类型的,所以对于这样的规则,需要一些共通函数来处理将日期转换为8位日期值、6位月份值等。

日期运算,基于日期,我们通常会计算日差、月差、时长等。一般数据库提供的日期运算函数都是基于日期型的,而在数据仓库中采用特定类型来表示日期的话,必须有一套自己的日期运算函数集。

聚集运算,对于事实表中的度量字段,他们通常是通过数据源一个或多个字段运用聚集函数得来的,这些聚集函数为SQL标准中,包括sum,count,avg,min,max

既定取值,这种规则和以上各种类型规则的差别就在于它不依赖于数据源字段,对目标字段取一个固定的或是依赖系统的值

四、      数据加载

  维表提供了事实表的上下文。虽然维表通常比事实表小得多,但它却是数据仓库的核心,因为它提供了查看数据的入口。我们经常说建立数据仓库其实就是建立维度。因此ETL团队在数据加载阶段的主要任务就是处理维表和事实表,将最有效的应用方式提交给最终用户。

维度的加载方式

Ø       手动生成维表最简单;

Ø       对于复杂、大型的维度表,需要进行清洗和规范化;

Ø       缓慢变化需要进行管理,以正确的主键,在适当的维度格式中写入物理磁盘。

缓慢变化维(SCD)加载:

覆盖:当某个维度成员的数据发生变化时,最新的列值将覆盖以前的维度记录,从而清除了该维度成员的历史记录

区分历史:当某个维度成员的数据发生变化时,最新的列值将存储为维度中的新记录,从而提供了一个维度成员的多个实例,这样便保留了历史记录

交替实体:当某个维度成员的列数据发生变化,而数据仓库要保留该变化列的最后一个版本时,原始数据将移到该维度记录的最后一个版本列中,并且所有新维度信息将覆盖现有列。

单独处理数据插入。很多ETL 工具(以及一些数据库)提供update else insert 功能。这个功能非常方便,且有着非常简单的数据流程逻辑,但是性能非常的低。ETL过程对已经存在的数据的更新逻辑中包括区分那些已经存储在事实表中记录和新数据。当处理大量的数据的任何时候,你想到的是数据批量加载到数据仓库。但是不幸的是,很多批量导入工具不支持更改已经存在的记录。通过分离需要更新的记录,你可以先处理更新,然后再执行批量的导入,这样获得最佳的加载性能。
    
利用批量加载工具。使用批量加载工具,而非使用SQL 语句加载大量数据可以降低数据库负载,并极大的提高加载效率。 
    
并行的加载。在加载大量数据的时候,将数据物理上分成不同的逻辑段。如果加载年的数据,你可以做个数据文件,每个文件中包含一年的数据。一些ETL 工具允许你根据数据范围进行数据分区。一旦数据被分成均等的部分,运行ETL 程并行的加载所有的分段。  

最小化物理更新。在表中更新记录操作需要耗用DBMS 很多资源,最大的原因是数据库要生成回滚日志。要最小化对回滚日志的操作,可以采用批量的加载数据。如何处理那些需要更新的数据呢?很多情况下,最佳的方式是删除要更新的记录,然后批量的加载所有的数据。由于要做更新的数据和总的数据量的比率会极大的影响优化方式的选择,因此需要一些反复测试来判断针对具体情况的最终加载策略。  

在数据库外进行聚合。在数据库之外进行排序,合并和聚合要比在DBMS 内使用SQL 语句,使用COUNT SUM 函数,GROUP BY  ORG ER BY 关键字高效的多。ETL 过程需要将巨大数量的数据进行排序、合并放在进入关系型数据库准备区之前完成。很多ETL 工具提供这些功能,但是专门的工具在操作系统级别执行排序/合并意味着为处理大数据集进行额外的投资。

原文地址:https://www.cnblogs.com/HondaHsu/p/2496425.html