数仓中的全量表、快照表、增量表以及拉链表
2020-08-19 本文已影响0人
喝奶茶不加奶茶
(一)一些基础概念:
- 存量:系统在某一时点的存有的数量。
本期期末存量=上期期末存量+本期内增量 - 流量:在某一段时间内流入\流出系统的数量。
- 增量:在某一段时间内系统中存有数量的变化。
增量=流入量-流出量
(二)四类表
一、全量表
- 全量表没有分区,表中的数据是前一天的所有数据。
比如今天是19号,那么全量表里面的就是18号的数据。 - 每次往全量表里面写数据都会覆盖之前的数据,所以全量表不能记录历史的数据情况,只有截止到当前最新的、全量的数据。
- 有无变化,都要报;每次上报的数据都是所有的数据(变化的+没有变化的)
二、快照表
- 快照表是有时间分区的,每个分区里面的数据都是分区时间对应的前一天的所有全量数据。
比如当前数据表有3个分区,24号、25号、26号,其中,24号分区里面的数据就是从历史到23号的所有数据;25号分区里面的数据就是从历史到24号的所有数据,以此类推。 - 缺点:
这种存储方法导致每个分区都存储了许多重复的数据,尤其在数据量大的时候,就会非常的浪费存储空间。
于是引出了拉链表,但先了解一下增量表。
三、增量表
- 记录每天新增数据的表,比如,从24号到25号新增了哪些数据,改变了哪些数据,这些都会存储在增量表的25号分区里面。
上面说的快照表的25号分区和24号分区(都是t+1,实际时间分别对应26号和25号),它俩的数据相减就是实际时间25号到26号有变化的、增加的数据,也就相当于增量表里面的25号分区的数据。 - 只报变化量,没有变化不用报(只有上报时间,开始时间更改为上报时间)。
四、拉链表
- 它是一种维护历史状态,以及最新状态数据的一种表。
- 是分区表,有些不变的数据或者是已经达到状态终点的数据就把它放在分区里面,分区字段一般为开始时间:start_date和结束时间:end_date。
一般在该天有效的数据,它的end_date是大于等于该天的日期的。 - 获取某一天全量的数据,可以通过表中的start_date和end_date来做筛选,选出固定某一天的数据。
举例:如果想取截止到20200819的全量数据,其where过滤条件就是
where start_date<='20200819' and end_date>=20200819 - 封链时间可以是2999,9999等比较大的年份;
- 拉链表到期数据要报0;
- 拉链表和增量表的共同点:表结构基本一样。
补充:
- 存量是在某一时刻的总量,存量一般设计成拉链表(月报(常用);日报)
- 流量和存量的区别:流量是增量;存量是总量。