跳到主要内容

分层架构

问题

数据仓库为什么要分层?ODS、DWD、DWS、ADS 各层的职责是什么?

答案

为什么要分层

原因说明
解耦上游数据源变了,只影响最底层,不用改上层
复用DWD 清洗一次,多个报表共用
可维护问题定位更清晰,每层职责明确
性能DWS 预聚合,BI 查询直接读汇总

四层架构

各层详解

ODS 层(Operational Data Store)

特点说明
数据来源业务库 binlog、日志文件、API 拉取
处理方式不做任何加工,原样入库
保留策略全量/增量,通常保留一段时间(如 3 个月)
命名规范ods_{来源}_{表名}

DWD 层(Data Warehouse Detail)

特点说明
核心职责清洗、去重、标准化、关联维度
粒度和 ODS 一样保持明细级
处理内容脏数据过滤、字段标准化、维度退化
命名规范dwd_{业务域}_{数据域}_{表名}
DWD 层示例:清洗订单明细
INSERT OVERWRITE TABLE dwd_trade_order_detail
SELECT
o.order_id,
o.user_id,
-- 标准化时间
DATE(o.create_time) AS order_date,
-- 关联维度表获取商品信息
p.category_l1,
p.brand,
-- 清洗金额(过滤异常值)
CASE WHEN o.amount > 0 AND o.amount < 1000000
THEN o.amount ELSE NULL END AS amount
FROM ods_trade_order o
LEFT JOIN dim_product p ON o.product_id = p.product_id
WHERE o.status != 'cancelled' -- 过滤取消订单
AND o.dt = '${bizdate}';

DWS 层(Data Warehouse Summary)

特点说明
核心职责按主题域 预聚合
粒度比 DWD 粗(日/周/月 × 维度组合)
典型输出用户日汇总、商品日汇总、渠道日汇总
命名规范dws_{业务域}_{数据域}_{粒度}
DWS 层示例:用户每日汇总
INSERT OVERWRITE TABLE dws_user_daily
SELECT
user_id,
order_date,
COUNT(DISTINCT order_id) AS order_cnt,
SUM(amount) AS total_amount,
COUNT(DISTINCT product_id) AS product_cnt
FROM dwd_trade_order_detail
WHERE order_date = '${bizdate}'
GROUP BY user_id, order_date;

ADS 层(Application Data Service)

特点说明
核心职责面向具体应用的最终表
使用方BI 看板、数据接口、算法特征
特点通常是宽表,查询不需要 JOIN
命名规范ads_{应用}_{表名}

DIM 层(维度层)

除了分层外,还有独立的维度层:

特点说明
存放内容公共维度表
示例dim_userdim_productdim_date
更新方式全量/拉链表

常见面试问题

Q1: 你们的数仓分了几层?每层做什么?

答案(标准回答框架):

  1. ODS:原始数据,不做加工,通过 binlog/日志/API 入库
  2. DWD:数据清洗、标准化、关联维度,保持明细粒度
  3. DWS:按主题聚合(用户日汇总、商品日汇总),提升查询效率
  4. ADS:面向业务报表的宽表,BI 直接查询
  5. DIM:独立维度表,被各层共用

Q2: DWD 和 DWS 的区别是什么?

答案

对比DWDDWS
粒度明细级(一行一条记录)汇总级(一行一个聚合)
处理清洗、标准化聚合、预计算
使用灵活查询(可做任意维度聚合)高频查询(预计算好了)

Q3: 如果业务方说"加一个指标",你改哪一层?

答案

  • 如果是已有数据的新聚合方式 → 改 DWS/ADS
  • 如果需要新的数据源 → 从 ODS 开始加
  • 如果是已有指标的新维度拆分 → DWD 层可能需要加字段

相关链接