使用ETL构建数据仓库的思考前端
背景:公司的数据仓库建设项目启动在即,所谓万事开头难,如何在咱们数仓建设规划的前期作好业务数据准备和系统建设规划是咱们须要思考的问题,这里根据以前的本身参与过的公司ODS系统运维、数据仓库项目建设和运维方面参与过的一些实际工做经验,并结合必定的数仓建设的理论知识,来简要介绍一下关于数据建设环节中ETL部分的基本知识,并谈一些本身的想法和思考,但愿能给你们一些启发和帮助。数据库
在数据仓库构建中,ETL贯穿于项目始终,它是整个数据仓库的生命线,包括了从数据清洗、整合,到转换,加载等的各个过程,若是说数据仓库是一座大厦,那么ETL就是大厦的根基,ETL抽取整合数据的好坏直接影响到最终的结果展示。因此ETL在整个数据仓库项目中起着十分关键的做用,必须摆到十分重要的位置。安全
1、什么是ETL
ETL是数据抽取(Extract)、转换(Transform)、加载(Load )的简写,它是将OLTP系统中的数据通过抽取,并将不一样数据源的数据进行转换、整合,得出一致性的数据,而后加载到数据仓库中。简而言之ETL是完成从 OLTP系统到OLAP系统的过程。性能优化
2、数据仓库的架构
数据仓库(Data Warehouse \ DW)是基于OLTP系统的数据源,为了便于多维分析和多角度展示将其数据按特定的模式进行存储而创建的关系型数据库,它不一样于多维数据库,数据仓库中的数据是细节的,集成的,数据仓库是面向主题的,是以 OLAP系统为分析目的。它包括星型架构与雪花型架构,其中星型架构中间为事实表,四周为维度表,相似星星;雪花型架构中间为事实表,两边的维度表能够再有其关联子表,而在星型中只容许一张表做为维度表与事实表关联,雪花型一维度能够有多张表,而星型不能够。考虑到效率时,星型聚合快,效率高,不过雪花型结构明确,便于与OLTP系统交互。在实际项目中,一般根据须要综合运用星型架构与雪花型架构。服务器
根据个人项目经验,通常建议使用星型架构。由于咱们在实际项目中,每每最关注的是查询性能问题,至于磁盘空间通常都不是问题。 固然,在维度表数据量极大,须要节省存储空间的状况下,或者是业务逻辑比较复杂、必需要体现清晰的层次概念状况下,可使用雪花型维度。架构
3、ETL构建企业级数据仓库五步法的流程
(一)、肯定主题
即肯定数据分析或前端展示的某一方面的分析主题,例如咱们分析某年某月某一地区的保单销售状况,就是一个主题。主题要体现某一方面的各分析角度(维度)和统计数值型数据(量度),肯定主题时要综合考虑,一个主题在数据仓库中即为一个数据集市,数据集市体现了某一方面的信息,多个数据集市构成了数据仓库。运维
(二)、肯定量度
在肯定了主题之后,咱们将考虑要分析的技术指标,诸如年销售额此类,通常为数值型数据,或者将该数据汇总,或者将该数据取次数,独立次数或取最大最小值等,这样的数据称之为量度。量度是要统计的指标,必须事先选择恰当,基于不一样的量度能够进行复杂关键性能指标(KPI)等的计算。工具
(三)、肯定事实数据粒度
在肯定了量度以后咱们要考虑到该量度的汇总状况和不一样维度下量度的聚合状况,考虑到量度的聚合程度不一样,咱们将采用“最小粒度原则”,即将量度的粒度设置到最小,例如咱们将按照时间对销售额进行汇总,目前的数据最小记录到天,即数据库中记录了天天的交易额,那么咱们不能在ETL时将数据进行按月或年汇总,须要保持到天,以便于后续对天进行分析。并且咱们没必要担忧数据量和数据没有提早汇总带来的问题,由于在后续的创建CUBE时已经将数据提早汇总了。性能
(四)、肯定维度
维度是要分析的各个角度,例如咱们但愿按照时间,或者按照地区,或者按照产品进行分析,那么这里的时间、地区、产品就是相应的维度,基于不一样的维度咱们可 以看到各量度的汇总状况,咱们能够基于全部的维度进行交叉分析。这里咱们首先要肯定维度的层次(Hierarchy)和级别(Level),维度的层次是指该维度的全部级别,包括各级别的属性;维度的级别是指该维度下的成员,例如当创建地区维度时咱们将地区维度做为一个级别,层次为省、市、县三层,考虑到维度表要包含尽可能多的信息,因此创建维度时要符合“矮胖原则”,即维度表要尽可能宽,尽可能包含全部的描述性信息,而不是统计性的数据信息。优化
还有一种常见的状况,就是父子型维度,该维度通常用于非叶子节点含有成员等状况,例如公司员工的维度,在统计员工的工资时,部门主管的工资不能等于下属成员工资的简单相加,必须对该主管的工资单独统计,而后该主管部门的工资等于下属员工工资加部门主管的工资,那么在创建员工维度时,咱们须要将员工维度创建成父子型维度,这样在统计时,主管的工资会自动加上,避免了都是叶子节点才有数据的状况。
二者的对比:父子维度即自引用表结构,好处是能够创建不固定深度的树形结构,很是的灵活。相似日期维度,固定了各个层级,而后经过“层次结构”来创建各个层级间的关系。对于OLAP系统来讲,统一的结构具备更强的可读性,可分析性,因此在不少时候咱们都会将父子维度转换成宽表。
另外,在创建维度表时要充分使用代理键,代理键是数值型的ID号码,好处是代理键惟一标识了每一维度成员信息,便于区分,更重要的是在聚合时因为数值型匹配,JOIN效率高,便于聚合,并且代理键对缓慢变化维度有更重要的意义,它起到了标识历史数据与新数据的做用,在原数据主键相同的状况下,代理键起到了对新数据与历史数据很是重要的标识做用。
有时咱们也会遇到维度缓慢变化的状况,好比增长了新的产品,或者产品的ID号码修改了,或者产品增长了一个新的属性,此时某一维度的成员会随着新的数据的加入而增长新的维度成员,这样咱们要考虑到缓慢变化维度的处理,对于缓慢变化维度,有三种状况:
一、缓慢变化维度第一种类型:历史数据须要修改。这样新来的数据要改写历史数据,这时咱们要使用UPDATE,例如产品的ID号码为123,后来发现ID 号码错误了,须要改写成456,那么在修改好的新数据插入时,维度表中原来的ID号码会相应改成456,这样在维度加载时要使用第一种类型,作法是彻底更改。
二、缓慢变化维度第二种类型:历史数据保留,新增数据也要保留。这时要将原数据更新,将新数据插入,须要使用UPDATE / INSERT,好比某一员工2005年在A部门,2006年时他调到了B部门。那么在统计2005年的数据时就应该将该员工定位到A部门;而在统计 2006年数据时就应该定位到B部门,而后再有新的数据插入时,将按照新部门(B部门)进行处理,这样咱们的作法是将该维度成员列表加入标识列,将历史的 数据标识为“过时”,将目前的数据标识为“当前的”。另外一种方法是将该维度打上时间戳,即将历史数据生效的时间段做为它的一个属性,在与原始表匹配生成事 实表时将按照时间段进行关联,这样的好处是该维度成员生效时间明确。
三、缓慢变化维度第三种类型:新增数据维度成员改变了属性。例如某一维度成员新加入了一列,该列在历史数据中不能基于它浏览,而在目前数据和未来数据中能够按照它浏览,那么此时咱们须要改变维度表属性,即加入新的列,那么咱们将使用存储过程或程序生成新的维度属性,在后续的数据中将基于新的属性进行查看。
(五)、建立事实表
在肯定好事实数据和维度后,咱们将考虑加载事实表。在公司的大量数据堆积如山时,咱们想看看里面到底是什么,结果发现里面是一笔笔生产记录,一笔笔交易记录… 那么这些记录是咱们将要创建的事实表的原始数据,即关于某一主题的事实记录表。
咱们的作法是将原始表与维度表进行关联,生成事实表。注意在关联时有为空的数据时(数据源脏),须要使用外链接,链接后咱们将各维度的代理键取出放于事实表中,事实表除了各维度代理键外,还有各量度数据,这未来自原始表,事实表中将存在维度代理键和各量度,而不该该存在描述性信息,即符合“瘦高原则”,即要求事实表数据条数尽可能多(粒度最小),而描述性信息尽可能少。
若是考虑到扩展,能够将事实表加一惟一标识列,觉得了之后扩展将该事实做为雪花型维度,不过不须要时通常建议不用这样作。
事实数据表是数据仓库的核心,须要精心维护,在JOIN后将获得事实数据表,通常记录条数都比较大,咱们须要为其设置复合主键和索引,觉得了数据的完整性和基于数据仓库的查询性能优化,事实数据表与维度表一块儿放于数据仓库中,若是前端须要链接数据仓库进行查询,咱们还须要创建一些相关的中间汇总表或物化视图,以方便查询。
四、ETL开发中补充注意的问题
(一)、准备区的运用
在构建数据仓库时,若是数据源位于一服务器上,数据仓库在另外一服务器端,考虑到数据源Server端访问频繁,而且数据量大,须要不断更新,因此能够创建准备区数据库。先将数据抽取到准备区中,而后基于准备区中的数据进行处理,这样处理的好处是防止了在原OLTP系统中中频繁访问,进行数据运算或排序等操做。例如咱们能够按照天将数据抽取到准备区中,基于数据准备区,咱们将进行数据的转换,整合,将不一样数据源的数据进行一致性处理。数据准备区中将存在原始抽取表,一些转换中间表和临时表以及ETL日志表等。
后期计划上线的公司数仓的数据来源执行现有的镜像库软件,对没有镜像库数据同步的业务系统暂时仍是采用数据直接抽取到临时加工库(准备区)的方式进行数据准备。
(二)、时间戳的运用
时间维度对于某一事实主题来讲十分重要,由于不一样的时间有不一样的统计数据信息,那么按照时间记录的信息将发挥很重要的做用。在ETL中,时间戳有其特殊的做用,在上面提到的缓慢变化维度中,咱们可使用时间戳标识维度成员;在记录数据库和数据仓库的操做时,咱们也将使用时间戳标识信息,例如在进行数据抽取时,咱们将按照时间戳对OLTP系统中的数据进行抽取,好比在午夜0:00取前一天的数据,咱们将按照OLTP系统中的时间戳取GETDATE到 GETDATE减一天,这样获得前一天数据。
目前我公司在现有ODS上采用数据获取机制是经过第三方软件方式去读取数据的变化,来获取变化数据,未能采用业务时间戳的方式来捕获增量数据,目前看来采用oracle官方的CDC机制(附加在核心数据库中增长核对库的运行负担)仍是咱们采购的DSG软件同步的方式(软件黑盒机制,发现的数据获取问题须要第三方厂商的介入,增长了问题处理时间成本),都存在必定的问题,须要咱们业务系统中增长对业务时间戳的变动一致性要求,能够初步的替换目前第三方的数据获取机制,保证数据的完整性。
(三)、日志表的运用(ETL数据流程的问题状态记录)
在对数据进行处理时,不免会发生数据处理错误,产生出错信息,那么咱们如何得到出错信息并及时修正呢? 方法是咱们使用一张或多张Log日志表,将出错信息记录下来,在日志表中咱们将记录每次抽取的条数,处理成功的条数,处理失败的条数,处理失败的数据,处理时间等等,这样当数据发生错误时,咱们很容易发现问题所在,而后对出错的数据进行修正或从新处理。
(四)、使用调度(ETL调度平台的建设及产品选型)
在对数据仓库进行增量更新时必须使用调度,即对事实数据表进行增量更新处理,在使用调度前要考虑到事实数据量,须要多长时间更新一次,好比但愿按天进行查看,那么咱们最好按天进行抽取,若是数据量不大,能够按照月或半年对数据进行更新,若是有缓慢变化维度状况,调度时须要考虑到维度表更新状况,在更新事实数据表以前要先更新维度表。
调度是数据仓库的关键环节,要考虑缜密,在ETL的流程搭建好后,要按期对其运行,因此调度是执行ETL流程的关键步骤,每一次调度除了写入Log日志表的数据处理信息外,还要使用发送Email或报警信息等,这样也方便的技术人员对ETL流程的把握,加强了安全性和数据处理的准确性。
除了本身建设调度平台这个手段以外,固然也能够结合采用一些成熟的商用的ETL调度平台工具,实现咱们的目标,例如采用一些商用的调度平台工具软件Control-M(国外)、TASKCTL(国内)等。
5、总结
ETL构建数据仓库须要简单的五步,掌握了这五步的方法咱们将构建一个强大的数据仓库,不过每一步都有很深的须要研究与挖掘,尤为在实际项目中,咱们要综合考虑,例如若是数据源的脏数据不少,在搭建数据仓库以前咱们首先要进行数据清洗,以剔除掉不须要的信息和脏数据。
总之,ETL是数据仓库的核心,掌握了ETL构建数据仓库的五步法,就掌握了搭建数据仓库的根本方法。不过,咱们不能教条,基于不一样的项目,咱们还将要进行具体分析,如父子型维度和缓慢变化维度的运用等。在数据仓库构建中,ETL关系到整个项目的数据质量,因此马虎不得,必须将其摆到重要位置,将ETL这一大厦根基筑牢!
附:BI工具(ETL部分)