案例背景与设计目标
以交易主题为例,把订单明细汇总成可复用的 DWS 表:按门店、商品类目、支付方式三个常用维度各出一张日汇总表,再加一张按类目与省份的月汇总表。设计目标是让看板与经营分析共用同一份口径中性的汇总数据,避免每个报表各自从明细算一遍。
基本信息
| 维度组合 | 门店、商品类目、支付方式各一张日表 |
|---|---|
| 月表 | 类目 + 省份,按自然月分区 |
| 度量 | 订单数、买家数、支付金额、退款金额 |
| 复用方 | 看板与经营分析共用 |
| 口径要求 | 中性,不带应用侧过滤规则 |
表清单与粒度
| 表名 | 粒度 | 主要度量 |
|---|---|---|
| dws_trade_store_day | 门店 + 日 | 订单数、买家数、支付金额 |
| dws_trade_category_day | 类目 + 日 | 订单数、支付金额、退款金额 |
| dws_trade_paytype_day | 支付方式 + 日 | 订单数、支付金额 |
| dws_trade_category_mon | 类目 + 省份 + 月 | 订单数、买家数、支付与退款金额 |
月表滚动写入
月表滚动写入
-- 月表按自然月分区,月初重算上月并回刷三天窗口
INSERT OVERWRITE TABLE dws_trade_category_mon PARTITION (mon='2026-10')
SELECT category_id,
province_id,
count(DISTINCT order_id) AS order_cnt,
count(DISTINCT buyer_id) AS buyer_cnt,
sum(pay_amt) AS pay_amt,
sum(refund_amt) AS refund_amt
FROM dwd_trade_order_di
WHERE dt BETWEEN '2026-10-01' AND '2026-10-31'
GROUP BY category_id, province_id;关键设计取舍
- 维度组合按查询频次选,不做「所有维度排列组合」式的表爆炸
- 度量选口径中性的原始聚合值,比率类指标留给 ADS 重算
- 买家数用去重计数,与订单数区分开,避免下游误用
- 退款金额单独成列而不做抵扣,退款口径变化时不必重跑历史
- 月表不只在月末跑,月初按回刷窗口重算,给迟到数据留出通道
月表在月初重算上月分区并保留三天回刷窗口,是让迟到数据能进入历史月份的常规做法;窗口长度按上游延迟分布确定,先统计再定,不要拍脑袋。
月表若只在月末跑一次,迟到数据永远补不进历史月份,且问题要到月度对账才暴露,届时只能整月重算。
为什么这样选维度
门店、类目、支付方式这三组维度之所以单独立表,是因为它们各自的下钻路径不同,合并成一张多维度组合表会让数据量按笛卡尔积放大,查询时又要按维度过滤,收益抵消。而类目加省份的月表承担的是经营复盘场景,维度不多但需要跨月趋势,放在月粒度比日粒度更省存储。
与上下游的衔接
- 上游统一从 dwd_trade_order_di 取支付成功的订单,过滤条件只写一次
- 下游 ADS 只负责加业务过滤与展示格式,不再重复做聚合
- 指标卡上登记每张表的口径,与表注释保持一字不差
- 新增维度组合前先统计现有表的复用率,避免重复建设