粒度声明是什么
粒度指汇总表的一行代表什么,通常写成「维度组合乘周期」,例如门店乘日、商品乘月。粒度必须在表名和表注释里显式写出来:表名用「主题_维度_周期」的结构,注释补一句完整粒度与过滤口径。粒度不明的汇总表最典型的后果是被下游按错误粒度二次聚合,比如把门店日汇总表直接按门店求和当成月累计,或者把近 30 日滚动窗口的表按天相加,数字重复计算却很难发现。
基本信息
| 表名结构 | 主题 + 维度 + 周期,如 dws_trade_store_day |
|---|---|
| 注释规范 | 一句话写清一行代表什么,以及过滤口径 |
| 主键设计 | 维度组合字段加分区列 |
| 分区方式 | 按汇总周期分区,日汇总按 dt |
| 唯一性要求 | 同一粒度只保留一张表,新需求先查已有表 |
| 校验方式 | 总行数与维度组合去重行数必须相等 |
| 风险点 | 粒度未声明时,下游会按自己理解的粒度使用 |
典型使用场景
- 新建 DWS 表时先定粒度和主键,再考虑放哪些指标,顺序反了会导致指标可加性混乱
- 建模评审时检索同主题是否已有相同粒度的表,能复用就扩指标而不是新建
- 下游接入前核对粒度与过滤口径,确认自己的聚合方式在该粒度下成立
- 跨粒度汇总(日转月)优先从明细重算,或在汇总表上按可加性规则相加
- 上线后做粒度校验:用总行数与维度组合去重行数比对,发现意外的重复行
粒度写法与校验
粒度写法与校验
CREATE TABLE dws_trade_store_day (
store_id STRING COMMENT '门店ID',
order_cnt BIGINT COMMENT '订单数',
pay_amt DECIMAL(18,2) COMMENT '支付金额'
)
COMMENT '交易主题-门店粒度-日汇总;粒度:store_id x dt;仅含已支付订单'
PARTITIONED BY (dt STRING);
-- 校验粒度唯一性:两列相等说明没有重复行
SELECT count(*) AS rows_cnt,
count(DISTINCT store_id) AS keys_cnt
FROM dws_trade_store_day
WHERE dt = '2026-10-12';几种粒度写法对照
| 表名写法 | 一行代表 | 可加性 |
|---|---|---|
| dws_trade_store_day | 门店乘日 | 按门店或按日求和成立 |
| dws_trade_store_mon | 门店乘月 | 按月可加,与日表叠加会重复计数 |
| dws_trade_sku_hour | 商品乘小时 | 跨天求和需按自然日边界切分 |
| dws_user_nday | 用户乘近 N 日滚动窗口 | 窗口重叠,跨窗口求和无效 |
两张粒度不同的表起了相近名字(day 与 day_detail、store_day 与 store_mon),下游取错表的概率极高,而取错后数字通常仍在合理区间,很难靠肉眼发现。
粒度声明要同时落在表名和表注释里。只在建模文档里写一次,随着人员流动和表数量增长,实际使用中很快就不再有人核对。