首页/数据/数仓建模速查/DWS 粒度声明与表名一致性
分层与规范64 条

DWS 粒度声明与表名一致性

粒度必须在表名与注释中显式声明(如 dws_trade_store_day 表示门店乘日),粒度不明的汇总表会被下游误用并导致重复计算。

数仓建模速查数据更新于 2026-10-13

粒度声明是什么

粒度指汇总表的一行代表什么,通常写成「维度组合乘周期」,例如门店乘日、商品乘月。粒度必须在表名和表注释里显式写出来:表名用「主题_维度_周期」的结构,注释补一句完整粒度与过滤口径。粒度不明的汇总表最典型的后果是被下游按错误粒度二次聚合,比如把门店日汇总表直接按门店求和当成月累计,或者把近 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),下游取错表的概率极高,而取错后数字通常仍在合理区间,很难靠肉眼发现。
粒度声明要同时落在表名和表注释里。只在建模文档里写一次,随着人员流动和表数量增长,实际使用中很快就不再有人核对。

易错点

  • 同粒度重复建表:同一指标出现两套数字,业务方每次都要人工判断以哪张为准
  • 表名不带周期信息(如 dws_trade_store):下游按日或按累计各取一次,口径完全不同
  • 对不可加粒度做二次聚合:近 30 日滚动窗口表按天相加,结果重复计数且偏差随天数扩大
  • 汇总表漏写过滤条件:下游把仅含已支付订单的口径当成全量口径,指标整体偏低
  • 建表时漏掉维度列进主键:同粒度出现多行,只有做粒度校验时才能发现

数据来源与参考

  • 阿里《大数据之路:阿里巴巴大数据实践》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌