1. 数据仓库介绍
1.1 数据分析的问题
- 做分析的时候,很多的业务数据都会分散的存储在不同的业务后台中。称为:
数据孤岛
- 数据量巨大,需要一种能够存储海量数据,同时也能分析海量数据的工具
- 工具最好能够支持常用的SQL,降低开发学习成本
2.2 解决问题
- 做数据的集中存储
- 分布式存储+分布式计算
2.3 满足条件的组件
-
Hive
存储基于分布式的HDFS
计算基于分布式的MapReduce、Spark、Tez
-
Impala
-
HAWQ
-
Spark、Flink 搭配 HDFS
2.4 数仓的简单概念
- 解决海量数据集中存储、分析计算统计等问题一种技术,可也以称之为数据分析专用的系统。
2.5 数仓的特点
- 数据的集中存储
- 海量数据分析计算
- 支持SQL语言
- 专用数据分析
2.6 数仓的标准概念
数据仓库(Data Warehouse)是一个面向主题(Subject Oriented)、数据集成(Integrated)、相对稳定(非易失)(Non-Volatile)、反映历史变化(时变)(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。
-
面向主题(Subject Oriented)
以数据分析需求来对数据进行组织划分若干主题,比如销售主题、员工主题,通过销售主题可以进行销售相关的分析,如年度销量排行、月度订单量统计等。
总之,主题是以分析需求为导向来组织数据,一般会根据你要分析的主题进行表结构设计存储,注意:主题中的数据是跨应用系统的。
-
数据集成(Integrated)
分散的业务数据(数据孤岛)完成集中化存储
一般企业中,数据仓库只会设计一套。因为目的是集中化存储业务数据待分析
-
相对稳定(非易失)
为了保证数据分析的准确性和稳定性,数据仓库中的数据一般是只进不出,会将历史快照保存下来。
对比起来业务系统一般记录的是事件的状态(最新)
数仓系统一般记录的是事件全生命周期走过的所有状态的记录
-
反映历史变化(时变)
数仓记录的是事件的全生命周期的状态更迭。所以历史状态等信息均能得到体现。
2.7 总结
数仓就是:企业想做数据分析,但是有数据孤岛、数据量太大等一系列问题,所以做出一个系统解决了集中存储的问题以及解决了海量数据计算的问题,同时还能支持类SQL操作最好。那么这个我们叫做数据仓库。
3. OLTP 和 OLAP 的区别
- OLTP:On-Line Transaction Processing:在线(联机)事务处理
- OLAP:On-Line Analytical Processing:在线分析处理
- 关键面向的场景不同,一个T事务,一个A分析
3.1 OLTP
简单概念:OLTP系统主要为了业务能够顺畅、稳定的运行
即联机事务处理,也称为面向交易的处理过程,其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理,并在很短的时间内给出处理结果,是对用户操作快速响应的方式之一,比如ERP系统,CRM系统,互联网电商系统等,这类系统的特点是事务操作频繁,数据量小。
3.2 OLAP
简单概念:OLAP系统主要为了数据能够高效的分析处理
即联机分析处理,有时也称为决策支持系统(DSS),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。这类系统的特点是没有事务性操作,主要是查询操作,数据量大。
大数据基本上都是OLAP的模式
4. 数仓的常见基础架构模式
4.1 ETL
- E:Extract、抽取
- T:Transformation、转换
- L:Load、加载
简单理解ETL就是:
- 输入(E)
- 处理(T)
- 输出(L)
简单来说:ETL就是从A点拿到数据,进行各种处理后,放到到B点
Sqoop就是一个典型的ETL工具,专为Hadoop设计
4.2 数据仓库与数据集市
数据仓库是用于企业整体分析的数据集合,比如分为:销售主题、客户主题、产品主题等。
数据集市是用于部门分析的数据集合,从范围上来讲它属于数据仓库的子集,比如:销售部门的数据集市只有销售主题。
数据集市不是必须的,看具体需要
5. 维度分析
数据仓库中的数据分析处理,其实就是对数据按照维度进行分析
5.1 维度
所谓的维度就是以不同的视角去看待数据
维度是事务的特征,如颜色、区域、时间等,可以根据不同的维度来对指标进行分析对比。比如根据区域维度来分析不同区域的产品销量,根据时间维度来分析每个月产品的销量。
维度也可以分为:
- 定性维度:在事务的特性上看待数据,比如:按照地理位置分布计算指标、按照颜色来计算
- 定量维度:在事务的数值上看待数据,比如:按照分数的区间统计各区间的学生人数,其实指标是可以转成维度的,所转成的维度就是定量维度。
5.2 指标
指标就是衡量事务发展的标准,也叫度量
,如价格,销量等;指标可以求和、求平均值等计算
指标也分为:
- 绝对数值:体现的是绝对值上的数据指标,比如:访问量、购买量、客单价
- 相对数值:体现的是相对值上的数据指标,比如:课程通过率、访问转化率
5.3 总结与举例
- 按照月份统计访问量:维度月份、指标访问量
- 按照天统计每天的访问量:维度天、指标访问量
维度一般是字符类型,指的是特性,X轴展示的就是维度信息,维度分为定性维度和定量维度。
指标一般是数值类型,Y轴展示的就是指标,指标分为绝对数值和相对数值。
5.4 维度的分层和分级
维度并非固定,维度都可以对其进行细化得到其子维度。
相当于将维度进行细分。维度->层次->级别
每个维度至少有一个层次且该层次至少有一个级别
时间维度:
一个层次四个级别:年、月、天、小时
课程维度:
课程名称:只有一个级别,每门课程的名称
课程分类:两个级别,大类和小类
课程难度:只有三个级别,简单、一般、难
课程等级:只有三个级别,初、中、高
地区维度:
一个层次三个级别:省、市、县
5.5 维度的上卷和下钻
上卷:从当前维度向上找其上层维度进行统计分析
下钻:从当前维度向下找其下层维度进行统计分析
假设维度是天
上卷维度:年、月
下钻维度:小时
6. 数仓建模
6.1 两种常见的数仓设计
-
三范式建模(Mysql)
尽量减少数据冗余,以关联的形式去关联数据
优点:空间占用小,数据冗余少
缺点:查询要用很多的Join
-
维度建模
不在意数据冗余,尽量为了维度而服务
优点:查询的时候不需要多数的Join
缺点:数据占用空间大
对于现代的企业来说,空间换性能,是划算的。因为硬盘便宜(相对)。
6.2 维度建模的概念
维度建模是围绕着事实表和维度表两个核心点来进行的
6.3 事实表
事实表记录了特定事件的数字化信息,一般由数值型数字和指向维度表的外键组成。
举例:JD用户下单,就是一个事件会产生一个下单的事件信息(事实信息)
事实表的设计依赖于业务系统,事实表的数据就是业务系统的指标数据。数据分析的实质就是基于事实表开展的计算操作,事实表有时候也称之为流水表
常见的事实表:
- 电商系统中的,订单表
- 在线教育中的,用户访问记录表、用户报名学习记录表
- 车联网系统中的,车辆信息上报表数据
6.3.1 事实表的分类
-
事务事实表(Transaction fact table)
指的是最细粒度的事实表,保存的是最原子的数据,又称之为
原子事实表
,一个事件是一条数据,现在数仓开发中经常使用的模式。
10001 1 12 已支付 2020-01-01 10:00:00 10001 1 12 以发货 2020-01-01 10:00:05 10001 1 12 已收货 2020-01-03 10:05:00 10001 1 12 已完成 2020-01-03 10:10:00
-
周期快照事实表(Periodicsnapshot fact table)
按照周期对事实进行聚合,得到某个方向的聚合结果
比如:订单事实表可以按照月聚合,得到每个月的订单量、订单金额、售卖商品数量等信息
就是一批数据到一条数据的转变
-
累积快照事实表(Accumulatingsnapshot fact table)
记录了事件的全生命周期中的所有状态节点的汇总
订单ID 用户ID 金额 是否支付 支付时间 是否发货 发货时间 是否收货 收货时间 是否完成 完成时间 10001 1 12 y 10:00:00 y 10:00:05 Y xxxx Y xxx
累计快照事实表是为数不多的在数仓设计中会使用
UPDATE
语句的设计这种设计用的不多了(老年代有)(现代数仓中很少用了)
6.4 维度表
维度表:观察数据的角度,一般是名词形式,记录的是一个事件或者实体的各个维度上的信息
特性:维度表中的每个列都可以作为一个维度去分析事实表的数据,维度表有时候也称之为
字典表
6.4.1 维度表的分类
- 高基数维度:数据量比较多,比如用户信息表、商品信息表等。
- 低基数维度:数据量也较少,数据增长在可见的未来也不会怎么增长的表,比如地理数据、分类数据等。
基于事实表和维度表的关联,我们可以从多个维度上去分析事实表中的数据
6.5 宽表
宽表就是事实表和维度表的集合
优点:
- 维度的更新,会在宽表里面跟随事实数据绑定(维度的更新,在宽表中是一种历史记录)
- 字段够多,查询无需JOIN
缺点:
- 数据量大(冗余多)
宽表在企业中应用是很广泛的。
因为,使用起来很简单,唯一的复杂点或者说性能点,在于数据写入的过程中要和很多维度表进行关联。
但是在使用的过程中是很爽的。
6.6 两种常见的建模方式
- 星型模型
- 雪花模型
6.6.1 星型模型
以一个事实表为中心,围绕着多个维度表
6.6.2 雪花模型
当有一个或多个维表没有直接连接到事实表上,而是通过其他维表连接到事实表上时,就像多个雪花连接在一起,故称雪花模型。
雪花模型是对星型模型的扩展,它对星型模型的维表进一步层次化。
6.7 缓慢渐变维(SCD)
-
SCD1
直接覆盖旧数据,不维护历史记录。历史数据就是错误数据,没有他用,直接更新维度表,这种模式用的人不会很多
-
SCD2(使用的最广泛的模式)
不删除、不修改历史数据,通过版本记录,来进行区分,
通过起始时间来标识,Valid To(封链时间)为 NULL 的标识当前数据,每个版本都会产生一行新的数据。
-
SCD3
SCD3希望维护更少的历史记录,把要维护的历史字段新增一列实现,历史数据都在同一行数据中。
但是如果要维护的字段比较多,就比较麻烦,适用于存储空间不足,并且用户接受有限历史数据的情况。
7. 数仓分层设计
7.1 迭代计算的概念
表1
订单id | 时间 | 用户 | 价格 |
---|---|---|---|
123 | 2020-12-22 11:38:16 | 1 | 11 |
321 | 2020-12-22 11:38:08 | 2 | 11 |
表2
订单id | 时间 | 季度 | 是否节假日 | 用户 | 价格 |
---|---|---|---|---|---|
123 | 2020-12-22 11:38:16 | q4 | n | 1 | 11 |
321 | 2020-12-27 11:38:08 | q4 | y | 2 | 11 |
表3
类型 | 销售额 |
---|---|
节假日 | 11111 |
非节假日 | 999 |
上面3个表可以看到,如果从表1直接得到表3,很难(缺少关键字段)
如果从表1 -> 表2 -> 表3 这样每个步骤单个都比较简单,最终也能得到表3的结果
这种模式叫迭代计算模式
在很多的业务场景中,很难从原始的事实表直接经过计算就得到你想要的结果。
中间会产生很多的中间结果表,经过这些中间结果一步步的得到你想要的内容。
7.2 数仓分层的概念
由于我们做数据分析,大体上在数仓中都是迭代的计算,这种计算就会分层次来进行。
这种迭代,通用可以分为3个层级:ODS,DW,ADS
7.2.1 ODS层
原始数据层(Original data service)
记录的是输入数据仓库数据的原始的样子
或者经过少量
的修改的样子
基本上是和来源的地方一致,为后一步的数据处理做准备。
作用:一种数据备份,数据溯源(迭代计算的起点)
7.2.2 DW层
数据仓库层(Data Warehouse)
在这个层级内就开始进行数据的迭代计算了,在这里会经过一步步的迭代最终得到我们想要的中间数据
DW层一般也会在内部详细划分出几个小层级
- 明细层DWD(Data Warehouse Detail):存储明细数据,此数据是最细粒度的事实数据。该层一般保持和ODS层一样的数据粒度,并且提供一定的数据质量保证。同时,为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。
- 中间层DWM(Data WareHouse Middle):存储中间数据,为数据统计需要创建的中间表数据,此数据一般是对多个维度的聚合数据,此层数据通常来源于DWD层的数据。
- 业务层DWS(Data WareHouse Service):存储宽表数据,此层数据是针对某个业务领域的聚合数据,应用层的数据通常来源与此层,为什么叫宽表,主要是为了应用层的需要在这一层将业务相关的所有数据统一汇集起来进行存储,方便业务层获取。此层数据通常来源与DWD和DWM层的数据。
简单描述:
DWD:数据粒度和ODS基本差不多,但数据经过维度退化、清洗、转换、过滤,格式统一等操作后得到的
DWM:进行维度的预聚合,预聚合指的是在通用的范围上进行聚合,比如,时间维度的聚合
DWS 业务层:针对业务主题完成数据聚合计算
很多时候,业务如果数据比较好,可以跳过DWM直接做DWS都是可以的。
有的时候,DWD也可以不要,但需要ODS数据质量本身就很好的情况下。
7.2.3 ADS
数据结果层(Application data service)
存储数据的计算结果,就是可以直接拿取用的,无需在执行计算的数据。
7.3 数仓分层总结
不管怎么分层,本质上就是:
- 输入(ODS 原始数据存储)
- 处理(DW 数据迭代计算,清洗、预聚合、针对性分析)
- 输出 (ADS 存储分析的结果)
在企业中,分层是很乱的,有的企业多达7 8 层,有的企业可能就2层
但大体上,都离不开:输入、处理、输出
分层的好处:
- 清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解。
- 复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题。
- 便于维护:当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
- 减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少重复开发的工作量。
- 提高查询性能:对于海量数据的复杂查询,分层后,将大大缩短获取信息的时间,提高数据统计效率。
8.数仓概念总结
理论与概念不是永恒不变的,当前大数据在各个公司中没有完全统一的标准,有个公司很乱,但只要能分析数据,在企业高层决策时提供科学的数据支撑就可,理论只是参考,你也可以定义标准。