# 数仓分层

# 概述

数据仓库分层,纵向层级的划分相对来说更为成熟与统一。尽管不同的团队和业务线的 纵向层级有的是四层,有的是五层,但究其本质都是三层结构,即原始层、中间层和应用层

通过对数仓在纵向进行分层,具有以下好处:

  • 复杂问题简单化:每层只负责某个复杂问题的一部分,方便问题的处理,并在出现故障时能够快速定位
  • 减少重复开发:把一些通用性的数据逻辑抽离出来,方便进行复用,避免重复开发
  • 数据解耦:当出现问题时不至于因为某个小问题而影响大片业务

# 分层规划

数据分层按通用的数据分层结构,整体如下:

# 整体分层结构

说明:

  • 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 中供数据分析和数据挖掘使用。比如我们 经常说的报表数据,一般就放在这里。