最近做一个需求,让我想起了之前在一本书上看到的一句话 快照和全量总是成双成对的
我借着这个需求来讲一下为什么要如此设计?
背景
- 我们有一张业务同步过来的事实表,可以是增量形式,也可以是全量形式,但是作为数仓人员,我们很难去了解业务的具体含义,如果是增量形式,我们还需要挖掘业务,想要做一张快照表,实施起来是麻烦的,容易出问题的,后续业务变更,数仓的变更逻辑也是复杂的,一般是建议业务同步过来的事实表最好是全量形式(离线数据)
- 增量数据抽取到数仓,并不需要复杂的merge操作,直接基于更新时间排序取最新一条数据即可,这样即是当日全量的数据.
- 快照表是对事实表业务过程生命周期的描述,一个具体过程的完结,也即是一条快照表数据的完结,快照表相对与当日全量表保存了业务过程的完整生命周期(状态)
- 需求是,我们要计算当日发放金额,当日发放金额,当日过期金额,累积剩余金额(累积发放金额 - 累积发放金额 - 累积过期金额),由于一条数据的状态会发生变化,如果是只计算当日的数据,事实上并没有什么问题,但是历史数据没有被修正,基于增量部分的计算方式会导致历史的累计指标出现问题的(修正历史数据) (涉及状态的累计指标怎么建模)
设计
dwd 全量/快照
dws 退化时间 按人(物) + 维度聚合(明确主键) + 各种度量(当日/当月/累积值)
adm 聚合dws层逻辑
遗留
- 半累积指标,就是在算钱的时候,状态的变更导致需要刷取历史数据,但是太久的数据我们是不需要刷取的,状态大致只会变更最近3个月的数据,这样情况,我们只需要刷取最近3个月的数据即可,上面给的例子其实也不会更改太久的历史数据,但是他要算累积数据,不太好取一个中间累积值
网友评论