DWS 是什么
DWS(Data Warehouse Summary)是汇总层,按主题域(交易、用户、流量等)加常用维度组合做预聚合,直接服务多个下游报表。核心判断标准是复用:同一份汇总能被两个以上使用方消费才值得放进 DWS,只服务单一报表的加工留在 ADS 更合适。表粒度必须写进表名和注释,例如 dws_trade_store_day 表示「按门店、按天」,否则下游无法判断能不能再按其他维度下钻。
基本信息
| 粒度 | 主题 + 维度组合,如门店 × 天 |
|---|---|
| 目标 | 跨报表复用,抵消重复计算 |
| 周期 | 日表与月表并存,月表可由日表累加 |
| 命名 | dws_主题_维度_周期 |
| 加工来源 | 通常读 DWD 明细,不直接读 ODS |
典型使用场景
- 同一份门店日汇总要给看板、日报、接口三处用:放 DWS 只算一次
- 指标口径统一:把「支付金额」的定义固化在 DWS,下游不再各自写过滤条件
- 降低查询成本:ADS 直接读 DWS,避免每次都扫 DWD 明细
- 月粒度汇总由日表累加,供月度报表复用,不重扫明细
- 新报表需求先查 DWS 有没有现成汇总,有则直接引用,没有再考虑新增
DWS 汇总
DWS 汇总
INSERT OVERWRITE TABLE dws_trade_store_day PARTITION (dt='2026-10-13')
SELECT store_id,
count(DISTINCT order_id) AS order_cnt, -- 去重口径:按单据去重
count(DISTINCT user_id) AS buyer_cnt, -- 去重口径:按用户去重
sum(pay_amt) AS pay_amt -- 可累加指标
FROM dwd_trade_order_di
WHERE dt='2026-10-13' AND order_status='PAID' -- 口径固化:只算已支付
GROUP BY store_id;月表由日表累加
月表由日表累加
-- 月表复用日表结果,避免重复扫描明细
INSERT OVERWRITE TABLE dws_trade_store_month PARTITION (month='2026-10')
SELECT store_id,
sum(order_cnt) AS order_cnt,
sum(pay_amt) AS pay_amt
FROM dws_trade_store_day
WHERE dt BETWEEN '2026-10-01' AND '2026-10-31'
GROUP BY store_id;设计要点
| 项 | 说明 | 注意点 |
|---|---|---|
| 表粒度 | 维度组合 + 时间粒度 | 写进表名与注释,供下游判断可下钻范围 |
| 维度选择 | 取跨报表出现频次最高的组合 | 组合贪多会让表数量快速膨胀 |
| 聚合方式 | count、sum 等可累加指标 | 去重类指标不能由日表直接加总得月值 |
| 更新策略 | 按分区重算,当日或次日调度 | 迟到数据要靠回刷分区补上 |
DWS 承担可复用聚合,只服务单一报表的加工留在 ADS,避免汇总层无限膨胀。判断很直接:如果一张 DWS 表的消费方只有一张报表,那它实际上属于 ADS。
去重类指标(日活、去重下单人数)直接相加得不到月值。跨周期汇总要在 DWS 里保留可再聚合的中间结果,例如去重键集合或位图,否则只能回到 DWD 重算。