数仓建模之周期快照事实表设计案例
周期快照事实表概念
周期快照事实表以具有规律性的、可预见的时间间隔记录事实,时间间隔如每天、每月、每年等,简称“快照事实表”
快照事实表特性
用快照采样状态
快照事实表以预定的间隔采样状态度量。这种间隔联合一个或多个维度,将被用来定义快照事实表的粒度,每行都将包含记录所涉及状态
的事实。
现在以淘宝交易卖家自然年汇总事实表为例进行介绍。淘宝活动运营小二或者卖家经常都需要看一些交易状态数据,比如自然年至今或者
历史至今的下单金额、支付金额、支付买家数、支付商品件数等状态度量,对于卖家而言,可能每天早上都想看一下截至昨天的成交情况;对于小二而言,可能在频繁的活动周期就需要查看一次成交情况。这些状态度量可以每天通过事务事实表进行聚集,但随着时间跨度变大聚集效率会越来越低,因此需要设计快照事实表进行状态的度量,这里用于采样的周期间隔是每天
下图快照事实表记录了每个卖家的下单和支付情况
快照粒度
事务事实表的粒度可以通过业务过程中所涉及的细节程度来描述,但快照事实表的粒度通常总是被多维声明,可以简单地理解为快照需要
采样的周期以及什么将被采样。
在淘宝交易卖家快照事实表中,粒度可以被理解为每天针对卖家的历史截至当日的下单支付金额进行快照。
当然,快照周期不一定都按天来进行,也可以按照月或者季度来统计。比如淘宝交易有针对卖家加类目的每月汇总事实表,每月统计一次,同时维度也不仅一个,包含了卖家和类目。
密度与稀疏性
快照事实表和事务事实表的一个关键区别在密度上。
事务事实表是稀疏的,只有当天发生的业务过程,事实表才会记录该业务过程的事实,如下单、支付等;
快照事实表是稠密的,无论当天是否有业务过程发生,都会记录一行,比如针对卖家的历史至今的下单和支付金额,无论当天卖家是否有下单支付事实,都会给该卖家记录一行。稠密性是快照事实表的重要特征,如果在每个快照周期内不记录行,比如和事务事实表一样,那么确定状态将变得非常困难。
半可加性
在快照事实表中收集到的状态度量都是半可加的。与事务事实表的可加性事实不同,半可加性事实不能根据时间维度获得有意义的汇总结
果。
比如对于淘宝交易事务事实表,可以对一个周期内的下单金额或者支付金额进行汇总,得到下单支付总额,但快照事实表在每个采样周期内是不能对状态度量进行汇总的。
比如淘宝交易卖家快照事实表,无法对每天的历史至今的下单金额进行汇总,也没有汇总意义。虽然不能汇总,但可以计算一些平均值,比如计算每天一个下单的平均值。
快照事实表设计
单维度的每天快照事实表
确定粒度
采样周期为每天,针对卖家、买家、商品、类目、地区等维度的快照事实表,比如淘宝卖家历史至今汇总事实表、淘宝商品自然月至今
汇总事实表等,不同的采样粒度确定了不同的快照事实表。
确定状态度量
确定好粒度以后,就要针对这个粒度确定需要采样的状态度量。
比如淘宝卖家历史至今汇总事实表,包含了历史截至当日的下单金额、历史截至当日的支付金额等度量
淘宝商品历史至今快照事实表,确定了商品维度和商品状态度
混合维度的每天快照事实表
混合维度相对于单维度,只是在每天的采样周期上针对多个维度进行采样。
比如淘宝买卖家历史至今快照事实表,采样周期依然是每天,维度是卖家加买家,反映的是不同买家对于不同卖家的下单支付金额
单维度和混合维度这两类快照事实表都有一个特点一一都可以从事务事实表进行汇总产出,这是周期快照事实表常见的一种产出模式。
淘宝卖家信用分和 DSR 快照事实表
该事实表直接使用操作型系统的数据作为周期快照事实表的数据源进行加工,比如淘宝卖家星级、卖家DSR 事实表等。
在淘宝店铺交易成功以后会进行一次好中差评以及 DSR 评价(包括物流服务、描述相符和服务态度),淘宝卖家信用就是基于好中差评计算得出的,DSR 评分会累积计算一个综合分;天猫店铺交易完成以后仅有 DSR 评价,默认都是好评
其中淘宝卖家信用是通过好中差评的次数进行计算的,具体为:好评加一分,中评零分,差评扣一分;然后累积最终的得分,得到卖家的信用,如上图的卖家信用分是25318 。
DSR 评分是通过分项的星级综合得到最终的评分,其中描述相符、服务态度和物流服务都是 1~5 星的打分方式,综合每一个星级的买家数得到最终的一个平均分,具体为:( 1 星× l 星人数+2 星×2 星人数+3 星×3 星人数+4 星×4 星人数+ 5星×5 星人数) /(1 星人数十2 星人数+3 星人数+4 星人数+5 星人数)。
前面所述的卖家信用分和DSR 评分都是在操作型系统中计算完成的,阿里巴巴数据仓库关于淘宝卖家信用分和DSR 快照事实表是直接
采用操作型系统数据进行设计加工,采样周期是每天,针对卖家维度的统计,状态度量就是卖家信用分和DSR 评分,如下:
全量快照事实表
全量快照事实表是一类特殊的快照事实表,这类事实表的特性与前面两类快照事实表有一些差异,但依然属于周期快照事实表范畴。
下面还是以淘宝好中差评快照事实表为例来阐述该类事实表的设计方法。
- 确定粒度
淘宝好中差评每天都在变化,下游统计分析也是每天都在进行的,因此确定采样周期是每天。这里的采样维度比较特殊,是针对评价本身,即每天按照评价进行采样的,每一条好中差评价就是快照事实表的最细粒度。 - 确定状态度量
对于好中差评价的度量关注更多的是评价本身,即没有类似于金额、商品数这样的度量,因此设计为无事实的事实表,更多关注评价的状态。对于全量快照事实表,这里再增加一步,即冗余维度。此如好中差评快照事实表,冗余了子订单维度、商品维度、评论者维度、被评论者维度以及杂项维度,包括评论内容、是否匿名等信息
注意事项
事务与快照成对设计
数据仓库维度建模时,对于事务事实表和快照事实表往往都是成对设计的,互相补充,以满足更多的下游统计分析需求,特别是在事务事
实表的基础上可以加工快照事实表。
如前面所述的淘宝卖家历史至今快照事实表,就是在事务事实表的基础上加工得到的,既丰富了星形模型,又降低了下游分析的成本。
附加事实
快照事实表在确定状态度量时, 一般都是保存采样周期结束时的状态度量。但是也有分析需求需要关注上一个采样周期结束时的状态度
量,而又不愿意多次使用快照事实表,因此一般在设计周期快照事实表时会附加一些上一个采样周期的状态度量。
周期到日期度量
在介绍淘宝卖家历史至今快照事实表时,指定了统计周期是卖家历史至今的一些状态度量,比如历史截至当日的下单金额、成交金额等。然而在实际应用中,也有需要关注自然年至今、季度至今、财年至今的一些状态度量,因此在确定周期快照事实表的度量时,也要考虑类似的度量值,以满足更多的统计分析需求。
淘宝数据仓库在设计周期快照事实表时,就针对多种周期到日期的度量设计了不同的快照事实表,比如淘宝卖家财年至今的下单金额、淘宝商品自然年至今的收藏次数等。