【读书笔记】《 Hadoop构建数据仓库实践》第1章
第1章 数据仓库简介
1.1 什么是数据仓库
Inmon将数据仓库描述为一个面向主题的、集成的、随时间变化的、非易失的数据集合,用于支持管理者的决策过程。
1.3 数据仓库架构
1.3.2 主要数据仓库架构
在数据仓库技术演化过程中,产生了几种主要的架构方法,包括数据集市架构、Inmon企业信息工厂架构、Kimball数据仓库架构和混合型数据仓库架构。
1. 数据集市架构
数据集市是按主题域组织的数据集合,用于支持部门级的决策。有两种类型的数据集市:独立数据集市和从属数据集市。
独立数据集市集中于部门所关心的单一主题域,数据以部门为基础部署,无须考虑企业级别的信息共享与集成。例如,制造部门、人力资源部门和其他部门都各自有他们自己的数据集市。独立数据集市从一个主题域或一个部门的多个事务系统获取数据,用以支持特定部门的业务分析需要。一个独立数据集市的设计既可以使用实体关系模型,也可以使用多维模型。数据分析或商业智能工具直接从数据集市查询数据,并将查询结果显示给用户。一个典型的独立数据集市架构如图1-2所示。
图1-2 独立数据集市架构另外一种数据集市是从属数据集市。如Bill Inmon所说,从属数据集市的数据来源于数据仓库。数据仓库里的数据经过整合、重构、汇总后传递给从属数据集市。从属数据集市的架构如图1-3所示。
图1-3 从属数据集市架构2. Inmon企业信息工厂架构(CIF)
图1-4 Inmon企业信息工厂架构● 企业级数据仓库:是该架构中的核心组件。正如Inmon数据仓库所定义的,企业级数据仓库是一个细节数据的集成资源库。其中的数据以最低粒度级别被捕获,存储在满足三范式设计的关系数据库中。
三范式定义
(1) 第一范式(1NF)
数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
例如,电话的字段就可能不符合第一正规化,因为每个人可能有一个以上的电话需要记录,这时最简单的做法就是将字段增加,不要用电话当字段名称,用家里电话、手机、办公室电话、分机号码、宿舍电话等。
(2) 第二范式(2NF)
规则是符合第一范式,而且没有部分主键功能决定其他属性的现象,也就是主键之外的其他属性都完全的功能相依于主键。
假定选课关系表为SelectCourse(学号,姓名,年龄,课程名称,成绩,学分),关键字为组合关键字(学号,课程名称),因为存在如下决定关系:(学号,课程名称)→(姓名,年龄,成绩,学分)。
这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称)→(学分),即知道课程,就可以知道该课程的学分。
(学号)→(姓名,年龄),即知道了学号,就可以知道该学生的姓名和年龄。
① 数据冗余
同一门课程由n个学生选修,“学分”就重复n?1次;同一个学生选修了m门课程,姓名和年龄就重复了m?1次。
② 更新异常
若调整了某门课程的学分,数据表中所有行的“学分”值都要更新,否则会出现同一门课程学分不同的情况。
③ 插入异常
假设要开设一门新的课程,暂时还没有人选修。这样,由于还没有“学号”关键字,课程名称和学分也无法记录入数据库。
④ 删除异常
假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。但是,与此同时,课程名称和学分信息也被删除了。很显然,这也会导致插入异常。
把选课关系表SelectCourse改为如下三个表。
学生:Student(学号,姓名,年龄)
课程:Course(课程名称,学分)
选课关系:SelectCourse(学号,课程名称,成绩)
这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。
(3) 第三范式(3NF)
在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。
所谓传递函数依赖,指的是如果存在“A→B→C”的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:关键字段→非关键字段x→非关键字段y。
假定学生关系表为Student(学号,姓名,年龄,所在学院,学院地点,学院电话),关键字为单一关键字“学号”,因为存在如下决定关系:
(学号)→(姓名,年龄,所在学院,学院地点,学院电话)
这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
(学号)→(所在学院)→(学院地点,学院电话)
把学生关系表分为如下两个表。
学生:(学号,姓名,年龄,所在学院);
学院:(学院,地点,电话)。
(4) BCNF范式
BCNF范式(Boyce/Codd Normal Form),是由R.F.Boycy和E.F. Codd共同提出的,可以算成是第三正则化的补充,规则是符合第三正则化原则,并且没有非主键属性可以功能性决定部分主键的现象。
假设有一个表R,其中的属性有A,B,C,D,E,以A和B为复合主键,R={A,B,C,D,E},如果存在有非主键属性,比如说C可以功能性决定B,C→B,而B是主键的一部分,这时第三正则化是没有办法分辨出来这种错误的,所以有BCNF正则化规则来把关,同样地,BCNF正则化的方法也是将原来的表拆开,成立一个新的关联表R1来装C→B,R1={C,B},但原来的表R还是以(A,B)为复合主键,以B为外键关联到新的表去,以保留原有的信息。
R={A,B,D,E},R1={C,B},R.B=R1.B
3. Kimball数据仓库架构
Kimball数据仓库架构如图1-5所示。
图1-5 Kimball数据仓库架构对比上一张图可以看到,Kimball与Inmon两种架构的主要区别在于核心数据仓库的设计和建立。Kimball的数据仓库包含高粒度的企业数据,使用多维模型设计,这也意味着数据仓库由星型模式的维度表和事实表构成。分析系统或报表工具可以直接访问多维数据仓库里的数据。在此架构中的数据集市也与Inmon中的不同。这里的数据集市是一个逻辑概念,只是多维数据仓库中的主题域划分,并没有自己的物理存储,也可以说是虚拟的数据集市。
4.混合型数据仓库架构
混合型数据仓库架构如图1-6所示。
图1-6 混合型数据仓库架构所谓的混合型结构,指的是在一个数据仓库环境中,联合使用Inmon和Kimball两种架构。从架构图可以看到,这种架构将Inmon方法中的数据集市部分替换成了一个多维数据仓库,而数据集市则是多维数据仓库上的逻辑视图。使用这种架构的好处是,既可以利用规范化设计消除数据冗余,保证数据的粒度足够细;又可以利用多维结构更灵活地在企业级实现报表和分析。
1.3.3 操作数据存储
操作数据存储又称为ODS,是Operational Data Store的简写,其定义是这样的:一个面向主题的、集成的、可变的、当前的细节数据集合,用于支持企业对于即时性的、操作性的、集成的全体信息的需求。
对比1.1节中数据仓库的定义不难看出,操作型数据存储在某些方面具有类似于数据仓库的特点,但在另一些方面又显著不同于数据仓库。
● 像数据仓库一样,是面向主题的。
● 像数据仓库一样,其数据是完全集成的。
● 数据是当前的,这与数据仓库存储历史数据的性质明显不同。ODS具有最少的历史数据(一般是30天到60天),而尽可能接近实时地展示数据的状态。
● 数据是可更新的,这是与静态数据仓库又一个很大的区别。ODS就如同一个事务处理系统,当新的数据流进ODS时,受其影响的字段被新信息覆盖。
● 数据几乎完全是细节数据,仅具有少量的动态聚集或汇总数据。通常将ODS设计成包含事务级的数据,即包含该主题域中最低粒度级别的数据。
● 在数据仓库中,几乎没有针对其本身的报表,报表均放到数据集市中完成;与此不同,在ODS中,业务用户频繁地直接访问ODS。
1.4 抽取-转换-装载
前面已经多次提到了ETL一词,它是Extract、Transform、Load三个英文单词首字母的简写,中文意为抽取、转换、装载。ETL是建立数据仓库最重要的处理过程。
● 抽取:从操作型数据源获取数据。
● 转换:转换数据,使之转变为适用于查询和分析的形式和结构。
● 装载:将转换后的数据导入到最终的目标数据仓库。
建立一个数据仓库,就是要把来自于多个异构的源系统的数据集成在一起,放置于一个集中的位置用于数据分析。
1.4.1 数据抽取
1.逻辑抽取
有两种逻辑抽取类型:全量抽取和增量抽取。
2.物理抽取
依赖于选择的逻辑抽取方法和能够对源系统所做的操作和所受的限制,存在两种物理数据抽取机制:直接从源系统联机抽取或者间接从一个脱机结构抽取数据。这个脱机结构有可能已经存在,也可能需要由抽取程序生成。
(1)联机抽取
数据直接从源系统抽取。抽取进程或者直连源系统数据库,访问它们的数据表,或者连接到一个存储快照日志或变更记录表的中间层系统。注意这个中间层系统并不需要必须和源系统物理分离。
(2)脱机抽取
数据不从源系统直接抽取,而是从一个源系统以外的过渡区抽取。过渡区可能已经存在(例如数据库备份文件、关系数据库系统的重做日志、归档日志等),或者抽取程序自己建立。应该考虑以下的存储结构:
3.变化数据捕获
抽取处理需要重点考虑增量抽取,也被称为变化数据捕获,简称CDC。假设一个数据仓库系统,在每天夜里的业务低峰时间从操作型源系统抽取数据,那么增量抽取只需要过去24小时内发生变化的数据。变化数据捕获也是建立准实时数据仓库的关键技术。
常用的变化数据捕获方法有时间戳、快照、触发器和日志四种。
1.4.2 数据转换
数据转换一个最重要的功能是清洗数据,目的是只有“合规”的数据才能进入目标数据仓库。
另一方面,由于某些业务和技术的需要,也需要进行多种数据转换,例如下面的情况:
● 只装载特定的数据列。例如,某列为空的数据不装载。
● 统一数据编码。例如,性别字段,有些系统使用的是1和0,有些是‘M’和‘F',有些是‘男’和‘女’,统一成‘M’和‘F'。
● 自由值编码。例如,将‘Male’改成‘M'。
● 预计算。例如,产品单价 * 购买数量 = 金额。
● 基于某些规则重新排序以提高查询性能。
● 合并多个数据源的数据并去重。
● 预聚合。例如,汇总销售数据。
1.4.3 数据装载
ETL的最后步骤是把转换后的数据装载进目标数据仓库。这步操作需要重点考虑两个问题,一是数据装载的效率问题,二是一旦装载过程中途失败了,如何再次重复执行装载过程。
1.4.5 常见ETL工具
传统大的软件厂商一般都提供ETL工具软件,如Oracle的OWB和ODI、微软的SQLServer Integration Services、SAP的Data Integrator、IBM的InfoSphereDataStage、Informatica等。
这里简单介绍另外一种开源的ETL工具——Kettle。
还有dataX(DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台),Sqoop,canal(阿里巴巴旗下的一款开源项目,纯Java开发),kettle。
更多内容请各大平台直接购买书籍,支持作者创作。