数据仓库理论知识
为什么要分层
分层的主要原因是在管理数据的时候,能对数据有一个更加清晰的掌控,详细来讲,主要有下面几个原因:
清晰数据结构:
每一个数据分层都有它的作用域,这样我们在使用表的时候能更方便地定位和理解。
数据血缘追踪:
简单来说,我们最终给业务呈现的是一个能直接使用业务表,但是它的来源有很多,如果有一张来源表出问题了,我们希望能够快速准确地定位到问题,并清楚它的危害范围。
减少重复开发:
规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算。
把复杂问题简单化:
将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
屏蔽原始数据的异常:
屏蔽业务的影响,不必改一次业务就需要重新接入数据
数仓分层思想
数据分层每个企业根据自己的业务需求可以分成不同的层次,但是最基础的分层思想,理论上数据分为三个层,数据运营层 数据仓库层和数据服务层。基于这个基础分层之上添加新的层次,来满足不同的业务需求。
数据运营层(ODS)
Operate data store,操作数据存储,是最接近数据源中数据的一层,数据源中的数据,经过抽取 洗净 传输,也就说传说中的ETL之后,装入本层。本层的数据,总体上大多是按照源头业务系统的分类方式而分类的。
例如:MySQL里面的一张表可以通过sqoop之间抽取到ODS层
ODS层数据的来源方式:
- 业务库
- 经常会使用sqoop来抽取,比如我们每天定时抽取一次。在实时方面,可以考虑用canal监听mysql的binlog,实时接入即可。
- 埋点日志
- 线上系统会打入各种日志,这些日志一般以文件的形式保存,我们可以选择用flume定时抽取,也可以用用spark streaming或者Flink来实时接入,当然,kafka也会是一个关键的角色。
- 消息队列
数据仓库层(DW):
Data warehouse,数据仓库层。在这里,从ODS层中获得的数据按照主题建立各种数据模型。例如以研究人的旅游消费为主题的数据集中,便可以结合航空公司的登机出行信息,以及银联系统的刷卡记录,进行结合分析,产生数据集。在这里,我们需要了解四个概念:维(dimension) 事实(Fact) 指标(Index)和粒度( Granularity)。
应用层(ADS):
该层主要是提供数据产品和数据分析使用的数据,一般会存放在ES MySQL等系统中供线上系统使用,也可能会存在Hive或者Druid中供数据分析和数据挖掘使用。
例如:我们经常说的报表数据,或者说那种大宽表,一般就放在这里。
1 ODS 数据准备层
功能
- ODS层是数据仓库准备区,为DWD层提供基础原始数据,可减少对业务系统的影响
建模方式及原则:
- 从业务系统增量抽取 保留时间由业务需求决定 可分表进行周期存储 数据不做清洗转换与业务系统数据模型保持一致 按主题逻辑划分
2 DWD 数据明细层
功能:
- 为DW层提供来源明细数据,提供业务系统细节数据的长期沉淀,为未来分析类需求的扩展提供历史数据支撑
建模方式及原则:
- 数据模型与ODS层一致,不做清洗转换处理 为支持数据重跑可额外增加数据业务日期字段 可按年月日进行分表 用增量ODS层数据和前一天DWD相关表进行merge处理
3 DW(B/S) 数据汇总层
功能:
- 为DW ST层提供细粒度数据,细化成DWB和DWS;
- DWB是根据DWD明细数据进行转换,如维度转代理键 身份证清洗 会员注册来源清晰 字段合并 空值处理 脏数据处理 IP清晰转换 账号余额清洗 资金来源清洗等;
- DWS是根据DWB层数据按各个维度ID进行高粒度汇总聚合,如按交易来源,交易类型进行汇合
建模方式及原则:
- 聚合 汇总增加派生事实;
- 关联其它主题的事实表,DW层可能会跨主题域;
- DWB保持低粒度汇总加工数据,DWS保持高粒度汇总数据;
- 数据模型可能采用反范式设计,合并信息等。
4 DM 数据集市层
功能:
- 可以是一些宽表,是根据DW层数据按照各种维度或多种维度组合把需要查询的一些事实字段进行汇总统计并作为单独的列进行存储;
- 满足一些特定查询 数据挖掘应用;
- 应用集市数据存储
建模方式及原则:
- 尽量减少数据访问时计算,优化检索;
- 维度建模,星型模型;
- 事实拉宽,度量预先计算;
- 分表存储
5 ST 数据应用层(ADS层)
功能:
- ST层面向用户应用和分析需求,包括前端报表 分析图表 KPI 仪表盘 OLAP 专题等分析,面向最终结果用户;
- 适合作OLAP 报表模型,如ROLAP,MOLAP;
- 根据DW层经过聚合汇总统计后的粗粒度事实表
建模方式及原则:
- 保持数据量小;
- 维度建模,星形模型;
- 各位维度代理键+度量;
- 增加数据业务日期字段,支持数据重跑;
- 不分表存储
数仓中表的种类及其概念
一般情况下表分为两个类型,分别维度表和事务表
维度表
维度表,一般是指对应一些业务状态,代码的解释表。也可以称之为码表。比如地区表,订单类型,支付方式,商品分类等等。
维度表可以分为两类:一般维度表和固定维度表
一般维度表的数据是不断增加和变化的
固定维度表的数据是不变的
事实表
事实表分为两类:事务型事实表和周期型事实表
事务型事实表,一般指随着业务发生不断产生的数据。特点是一旦发生不会再变化。 一般比如,交易流水,操作日志,出库入库记录等等。
周期型事实表,一般指随着业务发生不断产生的数据。与事务型不同的是,数据会随着业务周期性的推进而变化。
比如订单,其中订单状态会周期性变化。 再比如,请假 贷款申请,随着批复状态在周期性变化。
数仓中表的同步策略
维度表
可能会有变化的数据可以存储每日全量或者使用拉链表。(比如订单类型,审批状态,商品分类)
事实表
事务型事实表
- 每日增量: 因为数据不会变化,而且数据量巨大,所以每天只同步新增数据即可;每日分区。
周期型事实表
- 每日全量:首先这类表从数据量的角度,存每日全量的话,数据量太大,冗余也太大。
- 每日增量:如果用每日增量的话无法反应数据变化;每日新增及变化量可以用,包括了当日的新增和修改。一般来说这个表,足够计算大部分当日数据的。但是这种依然无法解决能够得到某一个历史时间点(时间切片)的切片数据。
- 拉链表:利用每日新增和变化表,制作一张拉链表,以方便的取到某个时间切片的快照数据。
所以我们需要得到每日新增及变化量。