什么是数据仓库
数据仓库(Data Warehouse)是一个面向主题的、集成的、稳定的且随时间变化的数据集合,用于支持管理人员的决策
- 面向主题:类型或者分类的意思,比如说农贸市场和超市,农贸市场针对里面的一个商贩,有萝卜白菜以及水果,都放在一个摊位上;在超市蔬菜和水果是分开的,在蔬菜里面还会进行细致的分类。农贸市场是按照商贩来分类的,而超市是按照商品也就是同一个主题来分类。
- 集成:对于传统的数据库而言,一般数据库之间是相互独立的,而数据仓库中的数据是在对原有分散的数据库的数据抽取清洗的基础上,经过系统加工汇总整理得到的,必须消除原数据中的不一致性,保证数据仓库内的信息是关于整个企业的一致的全局信息
- 稳定:相对稳定,传统数据库中的数据通常是实时更新的,用户做不同的操作,数据会做不同的变化;数据仓库主要供企业决策而指定的,所设计的数据操作主要是数据查询,修改和删除操作很少,像Hive根本就不支持,对于数据仓库而言只需要定时的刷新和加载数据
- 变化:反应数据历史的变化,传统的数据库主要关心当前某一个时间段内的数据,数据仓库通常包含历史信息,包含某个数据从刚开始到现在的历史信息,通过这些信息可以对企业的发展历程和未来的趋势作出一些分析和预测
数据仓库的建设是以企业业务系统和大量业务数据的积累为基础的,数据仓库不是静态的概念,只有把信息及时交给需要这些信息的使用者,供他们作出改善业务经营的决策,才能发挥出最大的价值。把信息加以整理归纳重组,并及时提供给相应的管理决策人员就是数据仓库的一个根本任务!
数据仓库基础知识
- 事实表、维度表:事实表指保存了大量业务数据的表或者是保存用户真实行为的表,比如销售商品的时候产生的一些订单数据;维度表指的是一个对象的属性或者特征(时间维度、地理区域维度、年龄维度等等)
- 数据库三范式
- 第一范式:数据库的每一列都是不可分割的原子数据项
- 第二范式:在第一范式的基础上,数据库表中的每一列都和主键相关,不能只和主键的某一部分相关(针对联合主键而言)
- 第三范式:要求在数据库表中不包含已在其它表中包含的非主键字段
数据仓库的建模方式
-
ER实体模型,这种模型就是满足了数据库第三范式的模型,是数据库设计的一个理论基础,几乎所有的OLTP系统设计都采用这种方式
-
维度建模模型:雪花模型、星型模型
-
Data Vault模型:是在ER模型上衍生而来的,初衷是有效的组织基础数据层,能灵活、易扩展对业务的变化,同时强调历史性,可追溯性和原子性
-
Anchor模型:设计高度扩展的模型,K-V结构的模型
数据仓库主要是采用维度建模模型:
- 星型模型
- 雪花模型(满足第三范式)
两种模型总结:
- 冗余:雪花模型符合业务逻辑设计,采用第三范式设计,有效降低数据冗余;星型模型的维度表设计不符合第三范式,反规范化,维度表之间不会直接关联,牺牲部分存储空间
- 性能:雪花模型由于存在维度间的关联,采用第三范式降低冗余,通常在使用过程中,需要关联更多的维度表,导致性能偏低;星型模型采用降维的操作将维度整合,以存储空间为代价有效降低维度表的连接数,性能相对较高
数据仓库分层
为什么要分层
数据仓库在构建的过程当中,通常都是需要分层处理,业务不同,分层的技术手段也是不同的,对数据进行分层的主要原因是希望在管理数据的时候能对数据有更加清晰的掌控,主要有以下原因:
- 清晰的数据结构,每一个分层的数据都有它的作用域,如此,在使用表的时候能更加方便的定位和理解
- 数据血缘关系的追踪,我们最终给业务方呈现的是一个能够直接使用的最终的一个业务表,但是这个业务表是由很多其它表计算出来的,如果有一张来源表出问题了,我们希望能够快速准备的定位到问题,并且清楚设计范围,分层之后就可以很好的定位问题
- 减少重复开发,分层之后可以开发一些通用的中间层数据,减少重复计算
- 复杂问题简单化,分层之后可以将一个复杂任务分解成多个步骤来完成,每一层值处理单一的步骤,也便于维护数据的准确性
- 屏蔽业务的影响,分层之后减少因为业务的改动而重新接入数据
数据仓库的分层设计
-
基础层:原始数据,数据原样保存
-
明细层:对基础层进行清洗,解决数据质量以及完整性的问题
-
主题层:数据的汇总层,对明细层的数据进行轻度聚合汇总,生成一系列的公共表。提升公共指标的复用性
-
专题层:根据业务的需要,统计前三层的数据,进行业务展示,一般会把这层的数据导出到MYSQL中 ,供线上的系统查询使用
在DWD层会进行数据的清洗,数据清洗的原则:
- 数据的唯一性校验
- 数据的完整性校验,采集的数据可能会缺失字段,针对缺失数据的数据,建议直接丢掉;如果可以确定缺失是哪一列,也可以进行补全,可以是默认值,也可以拿前一条数据的列值
- 数据合法性校验:针对数字列里面出现的null或者-之类的异常值,把这些值全部替换为一个特殊的值(比如0,-1)
数据仓库的命名规范
数据仓库分为4层,我们可以让它包含每一层的标识符,比如针对ODS层我们可以在Hive中去创建一个数据库,以ods_开头跟具体的业务名称,把同一层的这些表都放到这个数据库里面,对应四层就是四个数据库。
- ODS层命名为ods_
- DWD层命名为dwd_
- DWS层命名dws_
- ADS层命名为ads_
- 临时表命名为_temp
- 备份表 _bak
典型数仓系统架构
通过上图可以看到,建立一个数仓需要这么几个功能模块:
- 数据采集平台(采集各种数据源)
- 构建数据仓库(数据的存储和管理)
- 数据报表(数据可视化)