首页/数据/数据工程与 ETL 速查/数仓分层总览(ODS/DWD/DWS/ADS/DIM)

数仓分层总览(ODS/DWD/DWS/ADS/DIM)

离线数仓常见五层:ODS 贴源、DWD 明细、DIM 公共维度、DWS 轻度汇总、ADS 应用层;分层解决复用、口径统一与链路可维护问题,代价是存储与调度节点增加。

数仓分层是什么

分层是把数据从「贴源的原始形态」一步步加工到「可直接使用的指标结果」的过程拆成若干有明确职责的层:ODS 负责贴源落地,DWD 负责业务过程明细,DIM 承载公共维度,DWS 做主题级轻汇总,ADS 输出面向报表与接口的结果。

为什么要分层

三层收益很实在。第一是复用:一份明细清洗好之后,多个主题的汇总都从它出发,避免每个需求各自从原始表加工一遍。第二是口径收口:指标口径落在固定层,改一处就能改全链路。第三是可追溯:从最终结果能沿链路回溯到原始记录,出现异常时能定位到具体环节。

基本信息

常见层数ODS / DWD / DIM / DWS / ADS 五层,小团队可合并到四层
分层依据按加工深度与复用范围划分,而不是按报表划分
命名约定层前缀加主题与频率后缀,如 dwd_trade_order_detail_di
更新频率通常按天分区,dws 可能是 1d / nd / td 多种粒度
代价存储冗余与调度节点增加,链路变长后延迟上升

分层对照

层次定位典型加工
ODS贴源落地,结构与源一致抽取、加分区、极少清洗
DWD业务过程明细,清洗后复用去重、脱敏、类型规范、维度退化
DIM公共维度,全库共享一致性编码、历史跟踪(拉链表)
DWS按主题轻度汇总按天与粒度聚合出宽表
ADS面向报表与接口的最终结果口径计算、指标落地

典型使用场景

  • 新建数仓:先划清各层职责与命名规范,再动手建表
  • 口径打架:把指标实现位置统一收口到某一层,明确只在这一层定义
  • 新人接手:能按层前缀判断一张表的加工深度与更新方式
  • 链路排障:按「源端—ODS—DWD—DWS—ADS」逐层核对,快速定位断在哪一段
  • 性能优化:把重复计算下沉到公共层,避免多个 ADS 任务各算一遍

分层命名示例

分层命名示例
ods_order_mysql            源库订单表贴源,字段与源一致
dwd_trade_order_detail_di   订单明细(di 表示日增量)
dim_user_zip                用户维度拉链表(含生效与失效时间)
dws_trade_user_1d           用户主题日汇总(1d 表示最近一天)
ads_order_overview_1d       订单看板日结果

# 后缀约定同一套:di 日增量 / df 日全量 / 1d 最近一天 / nd 最近 N 天 / td 累计至今
分层不是越多越好:小团队可以只保留 ODS / DWD / DWS / ADS 四层,关键是每层的边界清晰、指标只在固定层实现。层数多而职责重叠,比少一层更麻烦。
ADS 直接读 ODS 跳过公共层会迅速制造口径分裂:同一个指标在不同报表里各写一遍 SQL,改口径时改一处漏三处,最终没人能说清哪张表是对的。

易错点

  • ADS 层直接消费 ODS,绕过公共明细与汇总层,口径散落各处,后续改口径必然漏改
  • 分层命名不统一(1d / di / ds 混用),没人能判断表的更新频率与是否可重跑
  • 把「层」当成目录而不定义职责:同一份清洗逻辑在 DWD 和 DWS 各写一遍,结果逐渐不一致
  • 为每个报表单独建一张 ADS 表而不共享公共层,存储与调度节点数量快速增长

数据来源与参考

  • 阿里《大数据之路:阿里巴巴大数据实践》数仓分层章节
  • Kimball《The Data Warehouse Toolkit》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌