一、数据仓库的用途
整合公司所有业务数据,建立统一的数据中心
产生业务报表,用于作出决策
为网站运营提供运营上的数据支持
可以作为各个业务的数据源,形成业务数据互相反馈的良性循环
分析用户行为数据,通过数据挖掘来降低投入成本,提高投入效果
开发数据产品,直接或间接地为公司盈利
二、数据集市与数仓的区别
数据集市(Data Market):是一种微型的数据仓库,它通常有更少的数据,更少的主题区域,以及更少的历史数据,因此是部门级的,一般只能为某个局部范围内的管理人员服务。
数据仓库(Data Warehouse):数据仓库是企业级的,能为整个企业各个部门的运行提供决策支持手段
三、数仓分层
- 分层原因
把复杂问题简单化:将复杂的任务分解成多层来完成,每一层只处理简单任务,方便定位问题。
减少重复开发:规范数据分层,通过中间层数据,能够减少大量的重复计算,增加一次计算结果的复用性。
隔离原始数据:不论是数据的异常还是数据的敏感性,使真实数据与统计数据解耦开
- 基本分层模型
ODS(数据源层,原始数据) – ETL --> DWD(数据明细层) – hive sql --> DWS(数据汇总) – sqoop --> ADS(数据应用:报表、用户画像)
- 数据仓库分层
3.1 数仓分层概述
在阿里巴巴的数据体系中,建议将数据仓库分为三层,自下而上为:
数据引入层ODS(Operation Data Store):存放未经过处理的原始数据至数据仓库系统,结构上与源系统保持一致,是数据仓库的数据准备区。主要完成基础数据引入到MaxCompute的职责,同时记录基础数据的历史变化。
数据公共层CDM(Common Data Model,又称通用数据模型层):包括DIM维度表、DWD和DWS,由ODS层数据加工而成。主要完成数据加工与整合,建立一致性的维度,构建可复用的面向分析和统计的明细事实表,以及汇总公共粒度的指标,根据目前业务特点,暂时只建立DWD层
明细粒度事实层(DWD):以业务过程作为建模驱动,基于每个具体的业务过程特点,构建最细粒度的明细层事实表。可以结合企业的数据使用特点,将明细事实表的某些重要维度属性字段做适当冗余,即宽表化处理。
数据中间层:DWM(Data WareHouse Middle)该层会在DWD层的数据基础上,对数据做轻度的聚合操作,生成一系列的中间表,提升公共指标的复用性,减少重复加工。直观来讲,就是对通用的核心维度进行聚合操作,算出相应的统计指标。
公共汇总粒度事实层(DWS):以分析的主题对象作为建模驱动,基于上层的应用和产品的指标需求,构建公共粒度的汇总指标事实表,以宽表化手段物理化模型。构建命名规范、口径一致的统计指标,为上层提供公共指标,建立汇总宽表、明细事实表。
公共维度层(DIM):基于维度建模理念思想,建立整个企业的一致性维度。降低数据计算口径和算法不统一风险。公共维度层的表通常也被称为逻辑维度表,维度和维度逻辑表通常一一对应。
数据应用层ADS(Application Data Service):存放数据产品个性化的统计指标数据。根据CDM与ODS层加工生成。
中英文及简写:
数据引入层(ODS,Operation Data Store)
数据公共层(CDM,Common Data Model)
公共维度层(DIM,Dimension)
数仓明细层(DWD,Data Warehouse Detail)
数据汇总层(DWS,Data Warehouse Service)
数据应用层(ADS,Application Data Service)。
3.2 各层级用途
1) 数据引入层(ODS,Operation Data Store):将原始数据几乎无处理的存放在数据仓库系统,结构上与源系统基本保持一致,是数据仓库的数据准备区。原始数据,主要是埋点数据(日志数据)和业务操作数据(binlong),数据源主要是 Mysql、HDFS、Kafka 等
2) 数据公共层(CDM,Common Data Model,又称通用数据模型层),包括 DIM 维度表、DWD 和 DWS,由ODS 层数据加工而成。主要完成数据加工与整合,建立一致性的维度,构建可复用的面向分析和统计的明细事实表,以及汇总公共粒度的指标。这一层里又包括三层:
公共维度层(DIM):
基于维度建模理念思想,建立整个企业的一致性维度。降低数据计算口径和算法不统一风险。公共维度层的表通常也被称为逻辑维度表,维度和维度逻辑表通常一一对应。
主要使用 MySQL、Hbase、Redis 三种存储引擎,对于维表数据比较少的情况可以使用 MySQL,对于单条数据大小比较小,查询 QPS 比较高的情况,可以使用 Redis 存储,降低机器内存资源占用,对于数据量比较大,对维表数据变化不是特别敏感的场景,可以使用 HBase 存储。
数仓明细层(DWD):
ODS 层经过清洗,落地这一层,一般是最细粒度。
以业务过程作为建模驱动,基于每个具体的业务过程特点,构建最细粒度的明细层事实表。可以结合企业的数据使用特点,将明细事实表的某些重要维度属性字段做适当冗余,即宽表化处理。
数据汇总层(DWS):
对 DWD 层的轻微聚合,对一些可累加的指标进行聚合,增加复用性。
以分析的主题对象作为建模驱动,基于上层的应用和产品的指标需求,构建公共粒度的汇总指标事实表,以宽表化手段物理化模型。构建命名规范、口径一致的统计指标,为上层提供公共指标,建立汇总宽表、明细事实表。公共汇总粒度事实层的表通常也被称为汇总逻辑表,用于存放派生指标数据。
3) 数据应用层(ADS,Application Data Service):存放数据产品个性化的统计指标数据。根据 CDM 与 ODS 层加工生成。
4.2 数据来源介绍
1) 业务数据
业务数据往往产生于事务型过程处理,所以一般存储在关系型数据库中,如 mysql、oracle。
业务数据源: 用户基本信息、商品分类信息、商品信息、店铺信息、订单数据、订单支付信息、活动信息、物流信息等
2) 埋点日志
埋点日志相对业务数据是用于数据分析、挖掘需求,一般以日志形式存储于日志文件中,随后通过采集落地分布式存储介质中如 hdfs、hbase。
用户行为日志: 用户浏览、用户点评、用户关注、用户搜索、用户投诉、用户咨询
3) 外部数据
当前一般公司都会通过线上广告来进行获客,与三方公司合作更多的提取相关数据来进行深度刻画用户及用户群体,另外爬取公共公开数据也是分析运营的常用方式。
外部数据源: 广告投放数据、爬虫数据、三方接口数据
- 分层的误区
数仓层内部的划分不是为了分层而分层,分层是为了解决 ETL 任务及工作流的组织、数据的流向、读写权限的控制、不同需求的满足等各类问题。
业界较为通行的做法将整个数仓层(DW)又划分成了 dwd、dwb、dws、dim、mid 等等很多层。然而我们却始终说不清楚这几层之间清晰的界限是什么,或者说我们能说清楚它们之间的界限,复杂的业务场景却令我们无法真正落地执行。
所以数据分层这块一般来说 ODS、DWD、DWS 这三层是最基础的:
至于DW层如何进行切分,是根据具体的业务需求和公司场景自己去定义,一般来说需要:
分层是解决数据流向和快速支撑业务的目的;
必须按照主题域和业务域进行贯穿;
层级之间不可逆向依赖。
如果依赖ODS层数据可以完成数据支撑,那么业务方直接使用落地层这也有利于快速、低成本地进行一些数据方面的探索和尝试。
确定分层规范后,后续最好都遵循这个架构,约定成俗即可;
血缘关系、数据依赖、数据字典、数据命名规范等配套先行;
DW 内的分层没有最正确的,只有最适合你的。
- 宽表的误区
在数仓层开始引入了宽表。所谓宽表,迄今为止并没有一个明确的定义。通常做法是把很多的维度、事实上卷(roll-up)或者下钻(drill-down)之后关联到某一个事实表中,形成一张既包含了大量维度又包含了相关事实的表。
宽表的使用,有其一定的便利性。使用方不需要再去考虑跟维度表的关联,也不需要了解维度表和事实表是什么东西。
但是随着业务的增长,我们始终无法预见性地设计和定义宽表究竟该冗余多少维度,也无法清晰地定义出宽表冗余维度的底线在哪里。
一个可能存在的情况是,为了满足使用上的需求,要不断地将维表中已经存在的列增加到宽表中。这直接导致了宽表的表结构频繁发生变动。
目前我们所采用的做法是:
根据主题域和业务域,将某个业务的所有节点梳理清楚;
将关键节点的数据作为事实表依据,然后横向扩充其他事实表上卷数据(包含一些统计指标),同时纵向的添加该节点上一些主键对应的维度;
宽表的涉及不依赖具体的业务需求而是根据整体业务线相匹配;
尽量用维度建模代替宽表;
为什么说尽量用维度建模代替宽表,就算字段和数据会冗余,维度建模的方式也会表全量数据的宽表模式较好,原因:
维度建模是以某一个既定的事实为依据,既然是事实表,那么这块的业务如果不变动的情况下,事实表的粒度基本不会改变;
事实表和维度表解耦,维度表的变更事实表基本不会影响,结果表也只需要回刷一下数据流程即可;
新增维度完全可以按照星型模型或者雪花模型动态添加新维度;
维度模型可以作为宽表的基础,一旦确定全部的数据流程,可以通过维度模型再生成对应宽表进行快速的业务支撑;
五、数仓建模
1.范式理论
1.1 范式概念
1)定义
范式可以理解为设计一张数据表的表结构,符合的标准级别、规范和要求。
2)优点
采用范式,可以降低数据的冗余性。
为什么要降低数据冗余性?
(1)十几年前,磁盘很贵,为了减少磁盘存储。
(2)以前没有分布式系统,都是单机,只能增加磁盘,磁盘个数也是有限的
(3)一次修改,需要修改多个表,很难保证数据一致性
3)缺点
范式的缺点是获取数据时,需要通过Join拼接出最后的数据。
4)分类
目前业界范式有:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)、第五范式(5NF)。