分层架构
问题
数据仓库为什么要分层?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_user、dim_product、dim_date |
| 更新方式 | 全量/拉链表 |
常见面试问题
Q1: 你们的数仓分了几层?每层做什么?
答案(标准回答框架):
- ODS:原始数据,不做加工,通过 binlog/日志/API 入库
- DWD:数据清洗、标准化、关联维度,保持明细粒度
- DWS:按主题聚合(用户日汇总、商品日汇总),提升查询效率
- ADS:面向业务报表的宽表,BI 直接查询
- DIM:独立维度表,被各层共用
Q2: DWD 和 DWS 的区别是什么?
答案:
| 对比 | DWD | DWS |
|---|---|---|
| 粒度 | 明细级(一行一条记录) | 汇总级(一行一个聚合) |
| 处理 | 清洗、标准化 | 聚合、预计算 |
| 使用 | 灵活查询(可做任意维度聚合) | 高频查询(预计算好了) |
Q3: 如果业务方说"加一个指标",你改哪一层?
答案:
- 如果是已有数据的新聚合方式 → 改 DWS/ADS
- 如果需要新的数据源 → 从 ODS 开始加
- 如果是已有指标的新维度拆分 → DWD 层可能需要加字段