# 数仓分层
# 概述
数据仓库分层,纵向层级的划分相对来说更为成熟与统一。尽管不同的团队和业务线的 纵向层级有的是四层,有的是五层,但究其本质都是三层结构,即原始层、中间层和应用层
通过对数仓在纵向进行分层,具有以下好处:
- 复杂问题简单化:每层只负责某个复杂问题的一部分,方便问题的处理,并在出现故障时能够快速定位
- 减少重复开发:把一些通用性的数据逻辑抽离出来,方便进行复用,避免重复开发
- 数据解耦:当出现问题时不至于因为某个小问题而影响大片业务
# 分层规划
数据分层按通用的数据分层结构,整体如下:
# 整体分层结构
说明:
- ODS 层:直接接入的原始日期数据,从业务库直接同步而来的数据
- DW 层:包含有数据逻辑处理层,进行数据的清洗,加工,同时对数据进行多维度的提炼
- APP 层:用于个性化数据场景处理,使用于特定的业务场景
- DIM 层:主要用于数据配置,提供公共参数类型
# 细节分层结构
整体如下
说明:
ODS 层:原始数据层,存放原始数据,直接加载原始日志、数据,数据保持原貌不做处理。
DWD 层:对 ODS 层数据进行清洗,主要包括:
- 去除空值
- 脏数据
- 超过极限范围的数据
- 行式存储改为列存储
- 改压缩格式
- 保存明细数据,一行信息代表一次业务行为,例如一次下单.
DWS 层:以 DWD 为基础,按天进行轻度汇总。一行信息代表一个主题对象一天的汇总行为,例如 一个用户一天下单次数
DWT 层:以 DWS 为基础,对数据进行累积汇总。一行信息代表一个主题对象的累积行为,例如一个 用户从注册那天开始至今一共下了多少次单
ADS 层:为各种统计报表提供数据
# 数仓命名规范
# 表命名
- ODS 层命名为
ods_表名 - DWD 层命名为
dwd_dim/fact_表名 - DWS 层命名为
dws_表名 - DWT 层命名为
dwt_表名 - ADS 层命名为
ads_表名 - 临时表命名为
xxx_tmp - 用户行为表,以
log为后缀。
# 脚本命名
- 数据源 to 目标 db/logsh
- 用户行为脚本以 log 为后缀;业务数据脚本以 db 为后缀
# 表字段类型
- 数量类型为 bigint
- 金额类型为 decimal(16,2),表示 16 位有效数字,其中小数部分 2 位
- 字符串(名字,描述信息等)类型为 string
- 主键外键类型为 string
- 时间戳类型为 bigint
# 关系建模与维度建模
数据处理大致可以分成两大类:联机事务处理 OLTP(on -line- transaction processing)、 联机分析处理 AP(On-ine Analytical Processing)OLTP 是传统的关系型 数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP 是数据仓库系 统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。二者 的主要区别对比如下表所示。
| 序号 | 对比属性 | OLTP | OLAP | 备注 |
|---|---|---|---|---|
| 1 | 读特性 | 每次查询只返回少量记录 | 对大量记录进行汇总 | |
| 2 | 写特性 | 随机、低延时写入用户的输入 | 批量导入 | |
| 3 | 使用场景 | 用户, Java EE 项目 | 内部分析师,为决策提供支持 | |
| 4 | 数据表征 | 最新数据状态 | 随时间变化的历史状态 | |
| 5 | 数据规模 | GB | TB 到 PB |
# 分层说明
# 数据操作层-ODS 层
- 保持数据原貌不做任何修改,起到备份数据的作用。
- 数据采用 LZO 压缩,减少磁盘存储空间 100G 数据可以压缩到 10G 以内。
- 创建分区表,防止后续的全表扫描,在企业开发中大量使用分区表。
- 创建外部表。在企业开发中,除了自己用的临时表,创建内部表外,绝大多数场景都是创建外部表。
- 存储周期:ODS 默认保留近 30 天的数据
# 公共的信息层-DIM 层
主要存放公共的信息数据,比如国家代码和国家名,地理位置等信息就存在 DIM 层表中, 对外开放,用于 DWD,DWS 和 APP 层的数据维度关联。可以理解为一些字典表、单独存放
- 数据机构:维表,以国家 ID 等字段为主键
- 存储周期:按需存储,一般会保留历史至今所有的数据
# 数据明细层-DWD 层
用于源系统数据在数据平台中的永久存储。它用以支撑 DWS 层和 DM 层无法覆盖的需求, 比如像用户通话详单类业务需求。
该层的数据模型不建议开给不懂技术的业务人员直接使用。 这一层主要解决一些数据质量问题和数据的完整度问题。
比如商场的会员信息来与不同表, 某些会员的的和数据可能不完整等等问题,我们可以再这一层做一些屏蔽
- 数据结构:数据结构与源系统保持一致
- 对用户行为数据解析。
- 对核心数据进行判空过滤。
- 对业务数据采用维度模型重新建模。
- 维度建模,减少后期大量 Join 操作
- 存储周期:保留历史至今所有的数据
# 数据汇总层-DWS 层
主要包含两类汇总表:一是细粒度宽表,二是粗粒度汇总表。
我们拿商场售卖举例,那么包含基于订单、会员、商品、店铺等实体的细粒度宽表和基于维度组合(会员日进场汇总、 会员消费汇总、商场销售日汇总、店铺销售日汇总等)的粗粒度汇总表。
这层是对外开放的, 用以支撑绝大部分的业务需求,汇总层是为了简化源系统复杂的逻辑关系以及质量问题等, 这层是的业务结构容易理解。
各个层面的工程师容易上手。dws 层的汇总数据目标是能满足 80%的业务计算。
- 数据机构: 宽表:以业务实体进行展开,将与业务有关的相关字段和属性进行预关联, 预处理和预计算,对业务实体进行拉伸形成宽表.汇总表:维度组合形成的汇总表
- 存储周期:原则上保留历史至今全部的数据
# ADS 层
主要是提供给数据产品和数据分析使用的数据,一般会存放在 ES、PostgreSql、Redis 等系统 中供线上系统使用,也可能会存在 Hive 或者 Druid 中供数据分析和数据挖掘使用。比如我们 经常说的报表数据,一般就放在这里。