数据仓库分层
1. 数据仓库为什么要分层
- 把复杂问题简单化
将复杂的任务分解成多层来完成,每一层只处理简单的任务,方便定位问题。 - 减少重复开发
规范数据分层,通过的中间层数据,能够减少极大的重复计算,增加一次计算结果的复用性。 - 隔离原始数据
不论是数据的异常还是数据的敏感性,使真实数据与统计数据解耦开。
2. 数据仓库分层说明
- ODS层: 原始数据层,存放原始数据,直接加载原始日志、数据, 数据保持原貌不做处理。
- DWD层: 对ODS层数据进行清洗(去除空值,脏数据,超过极限范围的数据)、脱敏等,保持业务事实明细,一样信息代表一次业务行为,例如一次下单。
- DWS层: 以DWD为基础,按天进行轻度汇总。一行信息代表一个主题对象一天的汇总行为,例如一个用户一天的下单次数。
- DWT层: 以DWS为基础,对数据进行累计汇总。一行信息代表一个主题对象的累积行为,例如一个用户从注册到至今一共下了多少单。
- DMI层: 维度层,保存维度数据,主要是对业务事实描述信息,例如何人何时何地等。
- ADS层: 为各种报表提供指标数据。
其中DWD层是以业务过程为驱动。
DWS层、DWT层和ADS层都是以需求为驱动,和维度建模已经没有关系了。
3. ODS层
在数据仓库中,ODS(Operational Data Store)层又被称为操作数据层,有如下特点:
- 数据与原业务数据保持一致,起到备份数据的作用,可以增加字段用来进行数据管理;
- 存储的历史数据是只读的,提供业务系统查询使用;
- 业务系统对历史数据修改后,追加回ODS中;
- 在离线数仓中,业务数据定期通过ETL流程导入到ODS中,导入有全量、增量、一次性导入方式。
- 数据源不限于结构化和非结构化数据。
4. DIM层和DWD层
DWD层需构建维度模型,一般采用星型模型,呈现的状态一般为星座模型。
维度建模一般按照以下四个步骤:
选择业务过程➡️声明粒度➡️确认维度➡️确认事实
4.1 选择业务过程
在业务系统中,挑选我们感兴趣的业务线,比如下单业务、支付业务、退款业务、物流业务,一条业务线对应一张事实表。
如果是中小公司,尽量把所有业务过程都选择。
如果是大公司(1000多张表),选择和需求相关的业务线。
4.2 声明粒度
数据粒度指数据仓库的数据中保存数据的细化程度或综合程度的级别。
声明粒度意味着精确定义事实表中的一行数据表示什么,应该尽可能选择最小粒度,以此来应各种各样的需求。
4.3 确定维度
维度的主要作用是描述业务是事实,主要表示的是"谁,何处,何时"等信息。
确定维度的原则是:后续需求中是否要分析相关维度的指标。例如,需要统计,什么时间下的订单多,哪个地区下的订单多,哪个用户下的订单多。需要确定的维度就包括:时间维度、地区维度、用户维度。
维度表:需要根据维度建模中的星型模型原则进行维度退化。
4.4 确定事实
此处的"事实"一词,指的是业务中的度量值(次数、个数、件数、金额等可以进行累加),例如订单金额、下单次数等。
在DWD层,以业务过程为建模驱动,基于每个具体业务过程的特点,构建最细粒度的明细层事实表。事实表可做适当的宽表化处理。
事实表和维度表的关联比较灵活,但是为了应对更复杂的业务需求,可以将能关联上的表尽量关联上。如何判断是否能够关联上呢?在业务表关系图中,只要两张表能通过中间表能够关联上,就说明能关联上。
5. DWS层和DWT层
5.1 DWS和DWT层的由来
DWS层和DWT层统称为宽表层,这两层的设计思想大致相同,通过以下案例进行阐述。
(1)问题引出:两个需求,统计每个省份订单的个数、统计每个省份订单的总金额。
(2)处理办法:都是将省份表和订单表进行join,group by省份,然后计算。相当于类似的需求重复计算了两次。
那怎么设计能避免重复计算呢?
针对上述场景,可以设计一张地区宽表,其主键为地区ID,字段包含为:下单次数、下单金额、支付次数、支付金额等。上述所有指标都统一进行计算,并将结果保存在该宽表中,这样就能有效避免数据的重复计算。
地区宽表的字段设计为:下单次数、下单金额、支付次数、支付金额等。只需要和每个事实表一次join。
5.2 总结
- 需要建哪些表:以维度为基准。
- 宽表里面的字段:是站在不同维度的角度去看事实表,重点关注事实表聚合后的度量值。
- DWS层统计各个主题对象的当天汇总行为,例如每个地区当天的下单次数、下单金额等。服务于DWT层的主题宽表。
- DWT层统计各个主题对象的累积行为,例如每个地区最近7天(15天、30天、60天)的下单次数、下单金额等
6. ADS层
数据应用层也被称为数据集市,里面存储数据分析结果,为不同业务场景提供接口,减轻数据仓库的负担。常见的功能有:
- 报表决策: 如Kylin,
- 并发查询: Hbase
- 搜索检索: Elastic Search