数仓学习笔记
DataWarehouse是一种思想
OLAP&OLTP
- OLTP联机事务处理
- 事务 时效性比较强
- 保障了数据的安全性
- 满足数据库三范式
- OLAP联机分析处理
- 对历史数据进行分析
数据建模
性能:良好的模型能帮我们快速查询需要的数据,减少数据的IO吞吐
成本:减少数据冗余,计算结果复用,从而降低存储和计算成本
效率
-
ER建模
- 三范式
- 规范性较好,冗余小,数据集成和数据一致性方面得到重视
- 面向应用
-
维度建模
- 维度建模将表分为三种类别:
- 事实表:本次事实发生的一个主题
- 面向分析,为了提高查询性能可以增加数据冗余,反规范化的设计技术
- 维度建模将表分为三种类别:
维度表
-
定义:分析数据的环境
-
维度表的范围很宽,每个属性都可以作为查询条件
-
维度的数据量一般在一个有限的范围内,相比起事实表小巫见大巫
-
-
设计原则
- 维度属性尽量丰富,为数据使用打下基础
- 给出详实的,富有意义的文字描述
- 区分数值型属性和事实
- 一个数字可能是度量值也可能是属性值
- 常用于查询约束条件或分组统计,就是作为维度属性
- 用于参与度量的计算,则是作为事实
- 退化维度:将属性不多的维度表的值直接放到事实表中,加快查询效率
- 缓慢变化维:
- 直接覆盖原值(不看历史数据,简单粗暴)
- 增加属性列
- 拉链表(需要在维度表再增加三列)
- 有效日期
- 截止日期
- 行标识(可选)
-
设计方法
- 数据仓库的能力直接与维度属性的质量和深度成正比
-
维度整合
多张表如果主键一致,但是每张表属性不同,如果合并可以考虑垂直整合
如果逐渐不同,但是属性相差无几,如果合并表可以考虑水平整合
- 垂直整合
- 水平整合
拆分
- 一张维度表要存储所有的商品信息
- 通用属性存放到主维表,独有属性存放到从维表
- 如果以后新增商品,商品的通用信息放主维表,独有信息放从维表
事实表
-
概念
- 每行数据代表一个业务数据
- 一条记录所表达的业务细节程度被称为粒度
- 为了度量业务,需要定义度量值,度量值一般为数值类型,数组可分为可加,半可加,不可加
- 维度属性也可以存储到事实表中,这种存储到事实表中的维度列被称为"退化维度"
-
设计原则
- 原则1:尽可能包含所有与业务过程相关的事实
- 原则2:只选择与业务过程相关的事实
- 原则3:分解不可加性事实为可加的组件
- 原则4:在选择维度和事实之前必须先声明粒度
- 理论来说越细越好,一般从最低级别的粒度开始
- 原则5:在同一个事实表中不能有多种不同粒度的事实
- 原则6:事实的单位要保持一致
- 原则7:对事实的null值要处理
- 使用0代替null,或者使用无效随机值代替null
- 原则8:使用退化维度提高事实表的易用性
-
设计方法
-
选择业务过程以及确定事实表类型
明确了业务过程后,根据具体业务需求来选择与维度建模有关的业务过程
- 声明粒度
- 确定维度
- 确定事实
- 冗余维度
-
如果说维度表能够进行复用,并且维度表字段较多,一般就不会进行退化
- 只有一些字段较少的,复用较少的会进行退化
- 比较典型的就是字典表
-
-
事实表分类
-
事务型事实表
- 单事务事实表
- 将相同的事务放在一张事实表中
- 多个事务有多张事实表
- 多事务事实表
- 将多个事务存放在一张表中
- 单事务事实表
-
周期型快照事实表
-
固定时间间隔的数据去产生结果
一般情况下,我们查看事务型事实表就可以知道自己的交易情况
但随着时间的推移,事务型数据越拉越多,就需要周期快照事实表帮助我们统计结果
周期快照事实表统计结果:
需要按照多个维度的组合间隔一段时间定时去生成
-
快照的粒度
- 事务型:取决于事务的细节程度
- 周期型:取决于时间 天、周、月、季、年
-
密度
- 周期型:密集 ,不管是否有事务发生,都会按照间隔进行计算
- 事务型:系数 ,事务发生的时候才会记录
-
可加性
- 周期型:一般都是半可加 ,因为是统计的结果
- 事务型:一般视为可加型
-
快照采样状态
- 快照事实表以预定的间隔采样状态度量。这种间隔联合一个或多个维度,将被用来定义快照事实表的粒度,每行都将包含记录所涉及状态的事实。
-
-
累积型快照事务表
跟踪业务的事实变化,覆盖过程的整个生命周期
-
数据组织方式
- 星型模型
- 由一个事实表和一组维度表组成;每个维表都有一个维作为主键,这些维的主键组合成事实表的主键
- 一种非正规化的结构,多为数据集的每一个维度都直接与事实表相连接,所以数据存在冗余
- 雪花模型
- 有一个或多个维度表没有直接连接到事实表上,而是通过其他维表连接到事实表上
- 相比起星型模型,虽然减少了数据的冗余,但查询的时候增加了表与表之剑的连接
- 星座模型
- 需要多个事实表共享维度表,可以视为星型表的集合
建模步骤
- 业务处理过程
- 维度建模是紧贴业务
- 要分析的数据不是凭空想象的,而是基于管理层或者产品想要了解的结果
- 我们要对原始数据进行分析得到对应的结果
- 声明粒度
- 选择能选的最小粒度
- 维度选择越小:数据量越大,支持的业务越多,计算量也越多[上卷]
- 维度选择越大:数据量越小,支持的计算越少
- 我们在进行计算的时候,只能计算当前粒度,以及大于当前粒度的数据
- 确认维度
- 维度退化
- 确保维度表中不出现重复数据,应使维度主键唯一
- 确认事实
- 度量值:如个数,件数,金额
- 事实表就是用来度量的,基本都以数量制表示,每行对应一个度量,每行中的数据是一个特定级别的细节数据
- 同一事实表中的所有度量必须具有相同的粒度
- 最实用的事实就是数值类型和可加类事实
数仓分层
-
原因
-
用空间换时间
通过大量的预处理来提升应用系统的用户体验(效率),但是会存在大量的冗余数据
-
增强扩展性
上游数据的改变不会对下游产生影响,中间层可以把数据处理成你想要的样子
-
分层管理
把复杂的工作拆成了多个简单的工作
-
-
优点
- 清晰数据结构
- 方便数据血缘追踪
- 减少重复开发
- 把复杂问题简单化
- 屏蔽原始数据的异常
-
明细
-
数据分层每个企业根据自己的业务需求可以分成不同的层次,但是最基础的分层思想,理论上数据分为三个层
-
ods(Operate data store)(操作数据存储层)原始数据层
- 最接近数据源中数据的一层.数据源中的数据,经过抽取、洗净、传输(ETL)之后,装入ODS层
- 本层的数据,总体上大多是按照源头业务系统的分类方式而分类的
-
DW(Data warehouse)数据仓库层
- 这层从ODS层中获取的数据按照主题建立各种数据模型[维度模型]
- 基于维度建模创建事实表与维度表
又分为两层:
- DWD明细数据层
- 存放事实表,并进行一些列的添加[维度退化]
- DWS汇总数据层
- 存储宽表,事实数据+维度数据
- 方便进行计算,减少表的连接
-
ADS(Appliication Data Service)应用数据服务
- 将计算的结果存储到ADS层,里面的数据要保证的原则就是 不需要进行二次计算
-
DIM维度表(可以视为在DW层,也可以视为在额外的区域)
- 存放维度表
-
-
ETL
-
概念:
ETL是将业务系统的数据经过抽取(Extract)、清洗转换(Transform)之后加载(Load)到数据仓库的过程
-
流程:
- 抽取:抽取是从各个不同的数据源抽取到ODS
- 转换:在抽取的过程中,将数据转变成需要的字段类型或者改为指定字段值
- 加载:就是将数据载入到数据仓库的操作
-
细节:
-
抽取
-
全量抽取
将表中所有的数据全部拉取到DW中
数据相对较少,每条数据都有可能被操作
全量的好处在于简便
-
增量抽取
基于某些条件(时间、标识)将服务条件的数据拉取到DW中
数据量大,每天新增数据一般不会影响历史数据
拉去的数据相对较少,但是需要进行判断,所以较为复杂
-
-
数据清洗转换
- 通常是从业务系统到ODS做清洗,将脏数据和不完整数据过滤掉,在从ODS到DW的过程中转换,进行一些业务规则的计算和聚合
-
-
ETL常用工具
- 首先要定位数据的类型,包括行为数据和业务数据
- 行为数据就是用户到网站后所有的后续操作
- 业务数据就是用户触发业务的时候将数据存储到关系型数据库
- 行为:Flume FileBeat LongStash
- 业务:sqoop DataX Kettle
- CDC:canal MaxWell FlinkCDC
-
大数据架构
-
流批
- 实时
- 离线
-
架构
-
Lambda
- Twitter工程师南森·马茨
- 流处理和批处理应该是分开的
- 公司需要有两套系统独立的系统
- 并不是说一个程序员既可以写流的代码还可以写批的代码
-
Kappa
- Linkedln的前首席工程师杰伊·克雷普斯提出的一种架构思想
- 流处理和批处理使用相同的业务逻辑
- 公司只需要搭建一套系统即可
-
-