文章目录
- [一. 数仓分层的意义](#一. 数仓分层的意义)
-
- [1. 清晰数据结构。](#1. 清晰数据结构。)
- [2. 减少重复开发](#2. 减少重复开发)
- [3. 方便数据血缘追踪](#3. 方便数据血缘追踪)
- [4. 把复杂问题简单化](#4. 把复杂问题简单化)
- [5. 屏蔽原始数据的异常](#5. 屏蔽原始数据的异常)
- [6. 数据仓库的可维护性](#6. 数据仓库的可维护性)
- [二. 如何进行数仓分层?](#二. 如何进行数仓分层?)
-
- [1. ODS层](#1. ODS层)
- [2. DW层](#2. DW层)
-
- [2.1. DW层分类](#2.1. DW层分类)
- [2.2. DWD层](#2.2. DWD层)
- [2.3. DWS](#2.3. DWS)
- [3. ADS层](#3. ADS层)
- 4、层次调用规范
一. 数仓分层的意义
1. 清晰数据结构。
每一个数据分层都有它的作用域,这样我们能根据自己的需求会快定位到要使用那些层的哪些表。
例如:客户信息同时存在于核心系统、信贷系统、理财系统、资金系统,取数时该如何决策呢?数据仓库会对相同主题的数据 进行统一建模,把复杂的数据关系梳理成条理清晰的数据模型,使用时就可避免上述问题了。
2. 减少重复开发
规范数据分层,开发一些通用的中间层数据,能够减少数据的重复计算。
数据的逐层加工原则,下层包含了上层数据加工所需要的全量数据,这样的加工方式避免了每个数据开发人员**都重新从源系统抽取数据进行加工。**极大地减少不必要的数据冗余,也能实现计算结果复用,极大地降低存储和计算成本。
3. 方便数据血缘追踪
简单来说,最终给业务呈现的是一个能直接使用的业务表,但是它的数据来源有很多,如果有一张来源表出问题了,分层后的数仓能够快速准确地定位到问题,并清楚它的危害范围。
4. 把复杂问题简单化
将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解 。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。
5. 屏蔽原始数据的异常
源头系统可能极为繁杂,而且表命名、字段命名 、字段含义等可能五花八门,通过 DW 层来规范和屏蔽所有这些复杂性。如果源头系统业务发生变更,相关的变更由 DW 层来处理,对下游用户透明,无须改动下游用户的代码和逻辑。
6. 数据仓库的可维护性
分层的设计使得某一层的问题只在该层得到解决,无须更改下一层的代码和逻辑。
二. 如何进行数仓分层?
数据分层最基础的分层思想将数据分为三个层:数据引入层 (ODS)、数据仓库层 (DW)和数据服务层 (ADS)。可以基于基础分层之上添加新的层次,来满足不同的业务需求。
1. ODS层
数据引入层(ODS,Operational Data Store,又称数据基础层),是最接近数据源中数据的一层,这将原始数据几乎无处理地 存放在数据仓库系统中,结构上与源系统基本保持一致。
这一层的主要职责是解决数据孤岛问题,保证数据集成完整性;数据与源系统表一致,体现非易失性;定期同步,增加表同步时间戳,体现时变性。
ODS层数据的来源方式:
- 业务库
离线:hive、flink批模式、sqoop定时调度。
实时:在实时方面, 可以考虑用canal监听mysql的binlog,实时接入即可。
-
埋点日志
-
线上系统会打入各种日志,这些日志一般以文件的形式保存,
离线:用flume定时抽取。
实时:用spark streaming或者Flink来实时接入存放到kafka中。
- 消息队列:来自ActiveMQ、Kafka的数据等。
2. DW层
数仓层(DW, data warehouse)是核心设计的一层,本层将从 ODS 层中获得的数据按照主题 建立各种数据模型,每一个主题对应一个宏观的分析领域,数据仓库层排除对决策无用的数据,提供特定主题的简明视图 。在DW层会保存BI系统中所有的历史数据,例如保存10年的数据。
DW存放明细事实 数据、维表 数据及公共指标汇总数据。
- 明细事实 数据、维表数据一般根据ODS层数据加工生成。
- 公共指标汇总数据一般根据维表数据和明细事实数据加工生成。
2.1. DW层分类
DW层又可以细分为维度层(DIM)、明细数据层(DWD)和汇总数据层(DWS)。
分层作用:
- 通过维度模型方法,可以定义维度模型主键与事实模型中外键关系,减少数据冗余,也提高明细数据表的易用性。
- 在汇总数据层同样可以关联复用统计粒度中的维度,采取更多的宽表化手段构建公共指标数据层,提升公共指标的复用性,减少重复加工。
分类:
- 维度层(DIM,Dimension):以维度作为建模驱动,创建各维度表。为了避免在维度模型中冗余关联维度的属性,基于雪花模型构建维度表。
- 明细数据层(DWD,Data Warehouse Detail):以业务过程作为建模驱动,构建最细粒度的明细事实表。
- 汇总数据层(DWS,Data Warehouse Summary):以分析的主题对象 作为建模驱动,基于上层的应用和产品的指标需求 ,构建公共粒度的汇总指标表。为上层提供公共指标,建立汇总宽表、明细事实表。
2.2. DWD层
DWD层做了哪些事?
1.数据清洗过滤
去除废弃字段,去除格式错误的信息
去除丢失了关键字段的信息
过滤核心字段无意义的数据,比如订单表中订单id为null,支付表中支付id为空
对手机号、身份证号等敏感数据脱敏
2.数据映射,转换
如boolean,有使用0 1标识,也有使用true false标识的
如字符串空值,有使用"",也有使用null,的,统一为null即可
如日期格式,这种就差异性更大,需要根据实际业务数据决定,不过一般都是格式化为YYYY-MM-dd HH:mm:ss 这类标准格式
2.3. DWS
DWS( data warehouse service)数据服务层,汇总层宽表
DWS是根据DWD层基础数据按各个维度ID进行粗粒度汇总聚合 ,如按交易来源,交易类型进行汇合。整合汇总成分析某一个主题域的服务数据,一般是宽表。
该层数据表会相对比较少,大多都是宽表(一张表会涵盖比较多的业务内容,表中的字段较多)。按照主题划分,如订单、用户等,生成字段比较多的宽表,用于提供后续的业务查询,OLAP分析,数据分发等。
比如用户每个时间段在不同登录ip购买的商品数等。这里做一层轻度的汇总会让计算更加的高效,在此基础上如果计算7天、30天、90天的行为会快很多。80%的业务都能通过DWS层计算,而不是ODS。
公共汇总事实表命名规范:
dws_{业务板块缩写/pub}_{数据域缩写}_{数据粒度缩写}[_{自定义表命名标签缩写}]_{统计时间周期范围缩写}
。关于统计实际周期范围缩写,缺省情况下,离线计算应该包括最近一天(_1d),最近N天(_nd)和历史截至当天(_td)三个表。如果出现_nd的表字段过多需要拆分时,只允许以一个统计周期单元作为原子拆分。即一个统计周期拆分一个表,例如最近7天(_1w)拆分一个表。不允许拆分出来的一个表存储多个统计周期。
对于小时表(无论是天刷新还是小时刷新),都用_hh来表示。对于分钟表(无论是天刷新还是小时刷新),都用_mm来表示。
举例如下:
dws_asale_trd_byr_subpay_1d(买家粒度交易分阶段付款一日汇总事实表)
dws_asale_trd_byr_subpay_td(买家粒度分阶段付款截至当日汇总表)
dws_asale_trd_byr_cod_nd(买家粒度货到付款交易汇总事实表)
dws_asale_itm_slr_td(卖家粒度商品截至当日存量汇总表)
dws_asale_itm_slr_hh(卖家粒度商品小时汇总表)---维度为小时
dws_asale_itm_slr_mm(卖家粒度商品分钟汇总表)---维度为分钟
3. ADS层
数据应用层(ADS,Application Data Store)存放着数据产品个性化 的统计指标数据,报表数据。
应用层主要是各个业务方或者部门基于DWD和DWS建立的数据集市(Data Market, DM),一般来说应用层的数据来源于DW层,而且相对于DW层,应用层只包含部门或者业务方面自己关心的明细层和汇总层的数据。
APP 层:为应用层,这层数据是完全为了满足具体的分析需求而构建的数据,也是星形或雪花结构的数据。如我们经常说的报表数据,或者说那种大宽表,一般就放在这里。包括前端报表、分析图表、KPI、仪表盘、OLAP、专题等分析,面向最终结果用户。
应用层是根据业务需要,由前面三层数据统计而出的结果,可以直接提供查询展现,或导入至Mysql中使用。
4、层次调用规范
-
禁止反向调用
-
ODS 只能被 DWD 调用。
-
DWD 可以被 DWS 和 ADS 调用。
-
DWS 只能被 ADS 调用。
-
数据应用可以调用 DWD、DWS、ADS,但建议优先考虑使用汇总度高的数据 。
ODS->DWD->DWS>ADS
ODS->DWD->ADS
参考: