谈笑间学会数仓—全量表&&增量表

全量表

全量表 增量表
数据 包含到前一天的全量数据 前一天的增量数据
分区 不分区(ymd为当前日期)(但是也有按天全量设计的,也叫全量表) 按照每一天分区

保存每天所有的最新状态的数据。

(1)全量表,有无变化,都要报
(2)每次上报的数据都是所有的数据(变化的 + 没有变化的)

一般导入数据时,不进行任何操作导入的数据就是全量表。
例如:平时使用sqoop直接导入,或者load加载,不需要任何特殊的操作,全表覆盖或者先删除表再插入数据,就是全量表。

以用户表为例,假设该表从2020-06-01开始记录数据,按天更新,分区为dt。
2020-06-01有三个用户注册,数据表如下:
谈笑间学会数仓—全量表&&增量表_第1张图片

2020-06-02有一名用户注册,即新增了一名用户(标红),表更新后2020-06-02分区内会记录全量的数据,包括2020-06-01的用户数据(标绿),此时数据表如下:
谈笑间学会数仓—全量表&&增量表_第2张图片

同理,2020-06-03又有2名用户注册,即新增了1名用户(标蓝),表更新后2020-06-03分区内会记录全量数据,即包含2020-06-02的用户数据(标黄),此时数据表如下:
谈笑间学会数仓—全量表&&增量表_第3张图片

因此,全量表每次更新都会记录全量数据,包括原全量数据和本次新增数据,即每个分区内的数据都是截至分区时间的全量总数据。注意:全量表中每个分区内都是截至分区时间的全量数据,原先分区的数据依然存在于表中,只是每次更新会在最新分区内再更新一遍全量数据。如上例,按照dt=2020-06-03查询出的数据是截至2020-06-03的所有注册用户数据,也可以按照dt=2020-06-02查询截至2020-06-02的所有注册用户数据。

增量表

当数据改变时,将这个改变和改变后的结果记录下来,就是增量表。(a账户分两次存了100块,增量表显示为a账户金额100,200,并分别记录变化时间)

新增数据,增量数据是上次导出之后的新数据。
(1)记录每次增加的量,而不是总量;
(2)流量是指在一定时间内的增量;
(3)流量一般设计成增量表(日报-常用、月报);
(4)流量和存量的区别:流量是增量;存量是总量;
(5)增量表,只报变化量,无变化不用报

以页面访问数据表为例,假设该表从2020-06-01开始记录数据,按天更新,分区为dt。2020-06-01产生了三条访问数据,如下表:

谈笑间学会数仓—全量表&&增量表_第4张图片

2020-06-02首页和商详页又产生了2条访问数据,该两条即为2020-06-02新增的数据,表更新后,dt分区2020-06-02新增2条数据(标红),此时数据表如下:

谈笑间学会数仓—全量表&&增量表_第5张图片

以此类推,2020-06-03又产生1条访问数据,表更新后,2020-06-03分区下新增1条数据(标黄),此时数据表如下:

谈笑间学会数仓—全量表&&增量表_第6张图片

因此,增量表每次更新是在原表数据的基础上记录本周期内新增的数据,如上例,按天更新的流量表,每次更新只新增一天内产生的新数据。注意:每次新产生的数据是以最新分区增加到表中,原先的数据依然存在于表中,如今天是2020-06-03,新增1条数据到表中,dt=2020-06-03,但2020-06-01的数据依然在表中,可以按照dt=2020-06-01进行查询;如果想使用最新全量数据,则扫描全表取最新数据即可。

小结

增量表和全量表在数仓设计过程中是非常常见的,常见形式为小规模数据量,采用日分区全量表+生命周期来做会是一个很好的方案。对于数据体量较大,并且数据变更不大的表可以通过增量表的方式进行,每日读取增量数据进行存储,也适用于周期性频繁变动的数据,5分钟、10分钟、30分钟等周期。并不是所有的表都可以做增量的,如果没有时间标识字段,那么是否能做增量也是一个需要思考的问题,怎么去做增量,跟数据库也有一定的关系,如果没有时间标识字段,那就只能通过binlog等去进行获取增量数据。

个人建议如果总数据量在百万以下,并且日增较小情况下,可以视情况去选择全量表,虽然全量表计算比较慢、存储占空间,但它是最准确的,增量不一定很准确。当然全量表也有弊端,如果需要获取数据的变化过程,怎么搞?

欲知后事如何,请听下回分解~

案例参考:https://blog.csdn.net/Jun2613/article/details/106688930/

你可能感兴趣的:(谈笑间学会数据仓库,谈笑间学会大数据,Hive,大数据,hive)