仓库分层

1.1 STG 缓冲层

Staging

将业务数据同步过来,不做任何转换,与业务数据库同构。​

主要用于因为特殊原因,无法在 ODS 一步完成业务数据快照的场景。如每天按照 update_time 把 T 日更新的记录同步到 STG 层,但 STG 表中会有重复的记录,无法方便地直接使用,需要做一次去重后写入 ODS 层。

1.2 ODS 存储层(操作性数据)

Operational Data Store

将业务数据快照过来,不做任何转换,与业务数据库同构。

一般存在 HDFS 上,即 Hive 或者 Hbase,Hive 居多。

1.3 EXT 对外输出缓冲层

External

STG 和 ODS 主要用于从外部数据源获取数据的缓冲和存储。有些时候,还需要直接把数仓的数据同步到外部数据源,用 EXT 层的表做为缓冲和存储,与外部数据表同构。

2.1 DWD 数据明细层

Data Warehouse Detail

数仓建设的核心。

对数据做规范化处理(编码转换、清洗、统一格式、脱敏等),不做横向整合。

一般保持和 ODS 层一样的数据粒度,并且提供一定的数据质量保证。同时,为了提高易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。

DWD 层要做的就是将数据 清理、整合、规范化脏数据、垃圾数据、规范不一致的、状态定义不一致的、命名不规范的 数据都会被处理。

DWD 层应该是覆盖所有系统的、完整的、干净的、具有一致性的数据层。在 DWD 层会根据维度模型,设计事实表和维度表,也就是说 DWD 层是一个非常规范的、高质量的、可信的数据明细层。

2.2 DIM 维度表

Dimension

维度指的是观察事物的角度,提供某一业务过程事件涉及用什么过滤和分类的描述属性,「谁、什么时候、什么地点、为什么、如何」干了什么,维度表是维度建模的基础和灵魂。

  1. 高基数维度数据:一般是用户资料表、商品资料表类似的资料表。数据量可能是千万级或者上亿级别。
  2. 低基数维度数据:一般是配置表,比如枚举值对应的中文含义,或者日期维表。数据量可能是个位数或者几千几万。

3 DWT / DWM,主题宽表层 / 轻度汇总层

Data Warehouse Topic / Data Warehouse Middle

对 DWD 各信息进行关联整合,输出主题宽表(面向业务过程,不同业务过程的信息不冗余建设,采用外键形式)。

直观来讲,就是对通用的核心维度进行聚合操作,算出相应的统计指标。

4 DWA / DWS / DM,汇总层 / 数据集市层

Data Warehouse Aggregation / Data Warehouse Service / Data Market

集中建设通用性维度和指标,降低业务需求开发成本。

按照业务划分,如流量、订单、用户等,生成字段比较多的宽表,用于提供后续的业务查询、OLAP 分析、数据分发等。

该层的数据表会相对比较少,一张表会涵盖比较多的业务内容,由于其字段较多,因此一般也会称该层的表为宽表。

在实际计算中,如果直接从 DWD 或者 ODS 计算出宽表的统计指标,会存在计算量太大并且维度太少的问题,因此一般的做法是,在 DWT/DWM 层先计算出多个小的中间表,然后再拼接成一张 DWA/DWS/DM 的宽表。

5 APP / ADS,应用层

Application / Application Data Service

面向业务需求进行定制开发。

主要是提供给数据产品和数据分析使用的数据,一般会存放在 ES、PostgreSql、 Redis 等系统中供线上系统使用(因为一般都要求比较快的响应速度),也可能会存在 Hive 或者 Druid 中供数据分析和数据挖掘使用。比如我们经常说的报表数据,一般就放在这里。

层间数据流向

稳定业务 / 标准数据流向

ODS → DWD → DWT → DWA → APP

  • 如果出现 DWT 缺失的情况,说明主题域未覆盖全。应将 DWD 数据落到 DWT 中。对于使用频度非常低的表,也允许直接 DWD → DWA。
  • 尽量避免在 DWA 宽表中使用 DWD 又使用(该 DWD 所属主题域的)DWT。
  • DWT、DWA、APP 层禁止直接使用 ODS。ODS 的表只能被 DWD 引用。
  • 禁止反向依赖。

非稳定业务 / 探索性需求

ODS → DWD → APP

ODS → DWD → DWT → APP

主题划分

主要考虑两类划分:面向业务、面向分析。

  • 面向业务:按照业务进行聚焦,降低对业务理解的难度,并能解耦复杂的业务。将实体关系模型进行变种处理为「实体」与「业务过程」模型。
    • 实体:定义为业务过程的参与体;
    • 业务过程:定义是由多个实体作用的结果,实体与业务过程都带有自己特有的属性。
  • 面向分析:按照分析聚焦,提升数据易用性,提高数据的共享与一致性。按照分析主体对象不同及分析特征,形成分析域主题在 DWA 进行应用,例如销售分析域、组织分析域。

表命名规则

通用规范

  • 使用 stg、ods、ext、dim、dwd、dwt、dwa、app、tmp 等分层作为前缀
  • 各部分用下划线分割
  • 各部分使用小写英文单词
  • 以字母为开头
  • 长度尽量不要超过 64 个字符
  • 表名的自定义部分不要用非标准的缩写

各层表名格式

  • {stg|ods|ext}[_外部存储类型]_业务库名__业务表名[_分区]
    • 外部存储类型是 mysql 的可以省略
    • 注意库名和表名之间是双下划线 __
  • dim[_主题[_子主题]]_维度名[_{detail|ext}][_分区]
  • {dwd|dwt|dwa|app}[_主题[_子主题]]_自定义表名[_分区]
  • tmp[_主题[_子主题]]_业务表名[_序号]
    • 序号:01~99
    • 细则待定
  • 全量快照分区表,可以用视图来索引最新有效的分区
    • 原表名(不含分区)_v
    • 如原表为 stg_auth__users_da,对应的最新分区视图为 stg_auth__users_v

表名中的分区信息

格式:{h|d|w|m|q|y}{a|i}

  • 时间范围
    • 小时:h
    • 日:d
    • 周:w
    • 月:m
    • 季度:q
    • 年:y
  • 分区内数据范围
    • 全量:a
    • 增量:i

举例:

  • 每小时一个全量快照分区:ha
  • 每天一个增量数据分区:di

附:ETL 任务 vs 表分区

ETL 任务其实并不关心数仓表的分区情况,除非要用 drop partition 等操作分区的方式进行存量数据清理。

  • 快照/全量 ETL 任务,关心的是快照附加日期时间字段的粒度/精度,如天、月、小时等。
  • 增量 ETL 任务,关心的是增量数据时间范围的粒度,如一次最少同步一天的增量数据,还是一个月,等等。

通用的 ETL 脚本(即不是某个表专用的 ETL)的后缀,表达的是数据同步的粒度和范围,格式为:

  • _时间粒度_数据范围
    • 时间粒度:hour、day、week、month、quarter、year
    • 数据范围:ss(快照/全量)、inc(增量)

为了强调跟表分区不是一个东西,这里使用单词/缩写。而表名为了节省字符数,使用单字母。

快照/全量 ETL 任务,如果表的一个分区只放一份快照,则可以使用 drop partition 进行清理,否则不可以。如:

  • ods__table_da, etl_day_ss: 可以 drop partition
  • ods__table_ma, etl_day_ss: 不可以 drop partition(一个分区里存放一个月内的所有快照)

增量 ETL 任务,如果数据的时间粒度和分区的粒度一致,且只同步单一粒度的数据,则可以使用 drop partition。

  • ods__table_mi, etl_month_inc: 同步单一月份,可以 drop partition
  • ods__table_mi, etl_day_inc: 同步一天数据,不可以 drop partition(分区里还有同月内其他天的数据)
  • ods__table_di, etl_day_inc: 同步一天数据,可以 drop partition
  • ods__table_di, etl_day_inc: 不同多天数据,理论上可以多次 drop partition,但目前暂不实现
这部分内容暂未在实战中洗礼

指标命名规则

基础指标词根

所有指标必须包含的基础词根。

  • 数量(count):cnt, bigint, 10+0
  • 金额类(amount):amt, decimal, 20+4
  • 比率/占比(ratio):ratio, decimal, 10+4
  • ……

业务修饰词

用于描述业务场景。如 交易:trade

日期修饰词

用于修饰业务发生的时间区间。

  • 小时(hourly):h
  • 日(daily):d
  • 周(weekly):w
  • 月(monthly):m
  • 季度(quarterly):q
  • 年(yearly):y

聚合修饰词

描述结果的聚集情况。

  • 平均(average):avg
  • 本周至今(WTD):wtd(本周一到当天的累计,week to date)
  • 本月至今(MTD):mtd
  • 本季度至今(QTD):qtd
  • 本年至今(YTD):ytd
  • ……

基础指标

单一的业务修饰词 + 基础指标词根

如 交易金额:trade_amt

派生指标

多修饰词 + 基础指标词根

派生指标继承基础指标的特性。如 安装门店数量:install_poi_cnt

普通指标命名规范

与字段命名规范一致。

日期类型指标命名规范

业务修饰词 + 基础指标词根 + 日期修饰词/聚合修饰词

如 七日交易金额:trade_amt_7d

  • 原子指标 + 业务限定 + 统计粒度 + 时间周期 -> 派生指标 -> 比较型派生指标
  • 支付转化率 + 无线端 + 买家 + 最近 30 天 ->最近 30 天买家在无线端的支付金额 -> 最近 30 天买家在无线端的支付转化率

聚合类型指标

业务修饰词 + 基础指标词根 + 聚合类型 + 日期修饰词

如 七日平均交易金额:trade_amt_avg_7d

清洗规则

总计约 24 条,待完善

  • 日期类型 -> 字符日期类:date, varchar, 10, YYYY-MM-DD
  • 数据类型 -> 数量类:cnt, bigint, 10+0
  • ……

数据资产管理

  • 词根管理
  • 指标管理
    • 指标定义
    • 指标树
  • 维度管理
    • 维度树
    • 数据类型
    • 计算逻辑
  • 码表管理
    • 码值统一
    • 码表状态
  • 数仓管理
    • 数据主题
    • 数据层次
    • 表类型
    • 数据粒度
    • 数据范围
数据资产管理的意义
  • 统一指标管理,保证指标定义、计算口径、数据来源的一致性。
  • 统一维度管理,保证维度定义、维度值的一致性。
  • 统一数据出口,实现维度和指标元数据信息的唯一出口,维值和指标数据的唯一出口。