数据仓库的分层
数据仓库的特征在于面向主题、集成性、稳定性和时变性,用于支持管理决策。数据仓库存在的意义在于对企业的所有数据进行汇总,为企业各个部门提供统一的、规范的数据出口。数据仓库在构建过程中通常都需要进行分层处理。业务不同,分层的技术处理手段也不同。数仓分层的主要原因:
- 通过数据预处理提高效率,因为预处理,所以会存在冗余数据
- 如果不分层而业务系统的业务规则发生变化,就会影响整个数据清洗过程,工作量巨大
- 复杂问题简单化 将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复(局部调整)
- 用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据
- 清晰数据结构 每一个数据分层都有它的作用域,这样在使用表的时候能更方便的定位和理解
- 数据血缘追踪 由于最终给业务呈现的是一个能直接使用的业务表,但是表的数据来源有很多,如果有一张来 源表出问题了,我们希望能够快速准确的定位到问题,并清楚他的危害范围
- 减少重复开发 规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算
数仓的常见分层一般为3层,分别为:数据操作层、数据仓库层和数据集市层。
当然根据研发人员经验或者业务,可以分为更多不同的层,只要能达到流程清晰、方便查数即可。
分层类别:basic(tmp)–>ods(sda)—>dwd—>dwa---->dm
ODS
Operate data store 操作数据存储 是最接近数据源中数据的一层,数据源中的数据,经过抽取、洗净、传输,也就说传说中的ETL之后,装入本层。本层的数据,总体上大多是按照源头业务系统的分类方式而分类的。
例如,这一层可能包含的数据表可为:人口表(包含每个人的身份证号、姓名、性别、年龄、住址等)、机场登机记录(包含乘机人身份证号、航班号、乘机日期、起飞城市等)、银联的刷卡信息表(包含银行卡号、刷卡地点、刷卡时间、刷卡金额等)、银行账户表(包含银行卡号、持卡人身份证号等)等等一系列原始的业务数据。这里我们可以看到,这一层面的数据还具有鲜明的业务数据库的特征,甚至还具有一定的关系数据库中的数据范式的组织形式。
但是,这一层面的数据却不完全等同于原始数据。在源数据装入这一层时,根据业务不同,可能会进行诸如去噪(例如去掉明显偏离正常水平的银行刷卡信息)、去重(例如银行账户信息、公安局人口信息中均含有人的姓名,但是只保留一份即可)、提脏(例如有的人的银行卡被盗刷,在十分钟内同时有两笔分别在中国和日本的刷卡信息,这便是脏数据)、业务提取、单位统一、砍字段(例如用于支撑前端系统工作,但是在数据挖掘中不需要的字段)、业务判别等多项工作。
ODS层数据的来源方式
- 业务库
经常会使用sqoop来抽取,比如我们每天定时抽取一次。在实时方面,可以考虑用canal监听mysql的binlog,实时接入即可。
- 埋点日志
线上系统会打入各种日志,这些日志一般以文件的形式保存,我们可以选择用flume定时抽取,也可以使用spark streaming或者storm来实时接入,当然,kafka也会是一个关键的角色。
- 其它数据源
不同的业务其它数据源不一样,比如第三方数据。
DW
Data warehouse 数据仓库层 数据仓库层是我们在做数据仓库时要核心设计的一层,在这里,从 ODS 层中获得的数据按照主题建立各种数据模型。DW层又细分为 DWD(Data Warehouse Detail)层、DWM(Data WareHouse Middle)层和DWS(Data WareHouse Servce)层。
在这里,我们需要了解四个概念(之后会讲述):
- 维(dimension)
- 事实(Fact)
- 指标(Index)
- 粒度(Granularity)
DW层分层
1. 数据明细层:DWD(Data Warehouse Detail)
该层一般保持和ODS层一样的数据粒度,并且提供一定的数据质量保证。同时,为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。
另外,在该层也会做一部分的数据聚合,将相同主题的数据汇集到一张表中,提高数据的可用性。
2. 数据中间层:DWM(Data WareHouse Middle)
该层会在DWD层的数据基础上,对数据做轻度的聚合操作,生成一系列的中间表,提升公共指标的复用性,减少重复加工。
直观来讲,就是对通用的核心维度进行聚合操作,算出相应的统计指标。
3. 数据服务层:DWS(Data WareHouse Servce)
又称数据集市或宽表。按照业务划分,如流量、订单、用户等,生成字段比较多的宽表,用于提供后续的业务查询,OLAP分析,数据分发等。
一般来讲,该层的数据表会相对比较少,一张表会涵盖比较多的业务内容,由于其字段较多,因此一般也会称该层的表为宽表。
在实际计算中,如果直接从DWD或者ODS计算出宽表的统计指标,会存在计算量太大并且维度太少的问题,因此一般的做法是,在DWM层先计算出多个小的中间表,然后再拼接成一张DWS的宽表。由于宽和窄的界限不易界定,也可以去掉DWM这一层,只留DWS层,将所有的数据在放在DWS亦可。
DM
Data mart 数据集市层 该层主要是提供数据产品和数据分析使用的数据,一般会存放在 ES、MySQL、PostgreSql、Redis等系统中供线上系统使用,也可能会存在 Hive 或者 Druid 中供数据分析和数据挖掘使用。 比如我们经常说的报表数据,或者说那种大宽表,一般就放在这里。每个分层不是必须要用ODS、DW、DM等字样来标识,可以随便起名字,只要统一这一层是什么类型数据,名字符合知名知意即可。
注:
数据集市 – 小型的,面向部门或工作组级数据仓库,即”小数据仓库”。如果说数据仓库是建立在企业级的数据模型之上的话。那么数据集市就是企业级数据仓库的一个子集,它主要面向部门级业务,并且只是面向某个特定的主题。数据集市可以在一定程度上缓解访问数据仓库的瓶颈。