什么是事实表?
记录一个业务过程的表叫做事实表。 比如广告点击表,记录的就是一条广告被点击的业务过程。 每一个事实表都包含可加性的度量值,维度外键
事实表的特征
数据量大;列数相对较少;经常发生变化,每天新增数据量多。
事实表的作用
描述业务过程;
事实表都包含哪些类型?
事务型事实表:
增量更新;
一行数据表示一条事务,一旦事务被提交,事实表数据被提交,数据就不再进行更改;
明细层事实表维度退化,减少后续使用join成本。
一般选用事件的发生日期或时间作为分区字段,便于扫描和裁剪;
周期型快照事实表
对应全量同步策略;
周期性快照事实表中不会保留所有数据,只保留固定时间间隔的数据。例如每天或者每月的销售额,每月的账户余额等
例如购物车,加减商品,我们更关心的是每天结束时这里边有多少商品,方便我们后期统计
累计型快照事实表:
对应新增及变化同步策略;
该类型的事实表中有一个状态的概念,比如订单的状态,是否付款,是否发货,是否收货等状态,一条数据在不同的时间点有不同的状态,该订单是否完结等。
选用时间结束时间作为分区字段;
累计型快照事实表用于跟踪业务事实的变化。例如数据仓库中可能需要累积或者存储订单从下订单开始,到订单商品被打包、运输、和签收的各个业务阶段的时间点数据来跟踪订单声明周期的进展情况。当这个业务过程进行时,事实表的记录也要不断更新。
累计型快照事实表的实现过程
累计型快照事实表需要使用动态分区,动态分区的是装载数据的时候不适用固定的分区值,而是在select查询的最后一行多加一个计算出的分区值。动态分区需要设置非严格模式。
步骤:
首日装载需要判断结束状态的时间是否存在,如果存在就将该条数据放到结束时间对应的分区中,如果结束时间不存在,也就是说该条数据是未结束状态,那么就将数据存放到9999-99-99分区中;
每天合并数据的时候,是将9999-99-99中的数据查出来和ods层今天的数据进行full outer join,然后查看合并之后的数据结束状态时间(可能不止一个,使用结束时间,失效时间都可以作为结束状态时间)存在不存在,这里的结束状态时间新旧数据有一个就行,新的有就用新的做分区字段,新的没有用旧的结束状态时间做分区字段,旧的也就是9999-99-99中查询出的数据,旧的也没有,就用9999-99-99作为分区字段。为什么先用新的呢,应为从9999-99-99中查出的数据是老的数据,新的数据中的结束状态可能已经有了,肯定要用最新的数据中的结束状态作为分区字段。
事实表的设计原则
1、事实表与业务强关联,事实表中尽可能全的包含所描述业务的所有事实指标,并且只包含与当前业务相关的事实指标,比如广告点击表中不包含游戏曝光次数指标。
2、保证事实表记录的可加性,事实表中的指标应当尽量可加,如果不可加应该拆解成可加的指标,比如广告的点击率,应该拆解成点击量和曝光量。
3、保证表中事实粒度一致,一个事实表中的粒度应当一致,不能存在粒度不一致的情况。
4、优化事实表可用性,退化维度,处理null值,保证事实单位一致
事实表的构建过程
事实表构建的过程也是维度建模的过程,两者概念一致。
选择业务过程:选择有分析需求的业务过程,比如要分析广告的点击率,那么分为两个过程,点击和曝光过程。
声明粒度:原则是尽量最细粒度构建,比如点击过程,粒度应该控制在一次广告点作为最细粒度
确定维度:原则是尽可能多的包含维度,便于后期做多维分析,比如一次点击过程,应该包含时间,地点,用户,场景,广告类型,广告主信息等等
确认事实:事实是衡量业务过程的度量,度量尽可能完备,点击事实表中一条数据的度量就是一次度量。不可加或者半加事实需要拆解成可加事实
冗余维度,也就是退化维度,尽量讲关联维度的属性字段冗余到表中,减少下游任务计算中的join