00:00
呃,来各位同学,那现在呢,我们看第二一个这个维度表的设计要点啊,那它的标题呢,叫做维度变化对吧?哎,那这一小节要讲的内容是什么呢?我们来看一看他这是怎么描述的啊,啊,他说维度属性通常不是静态的,而是会随时间变化的,哎,这句话大家现在先体会一下。这个能不能想明白啊,比如说举个例子啊,维度属性指的是什么,大家还记得吧,是不是就是我们最终落落实到我们表上面,是不是就有维度表上的一个字段呀,对吧,这样的OK,那比如说我们现在以谁为例,咱们以用户维度为例,那用户维度表当中,你想一想是不是会存储我们每一个用户的各种各样的属性信息啊,对吧?比如说他的生日,手机号码,电子邮件对吧,性别等等等等,那我们可能都会存储在这个维度表当中,那你想一想,我们一个用户他的这些属性信息是一成不变的吗?并不是有些可能是不变的,比如说性别这个不变对吧?啊,但是呢,有一些比如手机号码啊,啊,这个电子邮件啊,这些是都可能会发生变化,对吧?那所以这一点呢,我们需要体会到维度属性通常不是静态的,而是会随时间变化的,诶然后我们继续往下看,那数据仓库呢,它有一个重要的特点,就是干啥来着,反映历史的变化,其实在第一天咱们上数仓的第一天课的时候,我就给大家说了,数仓是不是有一个非常非常重要的特点,就是会保存历史数据啊,对吧?那为什么要保存历史数据呢?因为保存的历史数据我们就能够看到这个数据随时间的一个变化了,对吧?那我们再去使用数据的时候,我们就能多一条分析数据的,当时说的是角度对吧,但是其实大家现在也可能想明白了,其实就是多了一条分析数据的维度吧,对吧,那这个维度的其实就是时间维度,对不对啊,是这样的啊OK,好,那数仓的这个特点咱们也要给他搞清楚,然后接下来呢,我们就考需要考虑一个问题了,什么问题呢?就是说如何去保存。
01:54
维度的历史状态。对不对,因为数仓你得反映历史变化,你怎么能反映呢?你是不是得把这个维度的历史状态保存下来,这是不是才能反映这个历史的变化呀,对吧?哎,是这样的,那所以说实际上呢,我们本节要讨论的主要内容并不是说这个维度它怎么变,我们要讨论的主要内容呢,是如何去保存维度的历史状态,哎,是这样的,OK,好,那通常情况下呢,我们保存维度的历史状态一共有这样的两种做法,来我们看下边分别是全量快照表和拉链表啊这里边儿呢,咱们引出来一个非常重要的概念,就是拉链表,这个呢是非常非常重要的,无论是呃,咱们面试还是这个开发,都是比较重要的一个知识点啊,所以这块一定得引起重视啊,好,那接下来我们先继续往下看,我们先看第一种方案啊,就是全量快照表啊,全量快照表它怎么去做呢?我们来看一下它是如何描述的,离线数仓的计算周期通常为每天一次,对吧?那所以说你可以怎么做呢?你可以每天保存一份。
02:58
全量的维度数据,哎,那这样一来能不能保存下来我们这个维度的历史状态呢?大家说能不能,其实可以的啊,OK,这个怎么去理解,所谓的全量快照表,这个你要补全了之后,应该叫做每日全量快照表,那就相当于我这个维度表,我怎么去建呢?我维度表OK,我建一个分区表对吧?那OK,我按照什么去分区呢?我按照天,按照日期去分区,我一天一个分区,对吧?那我每天的分区里我存什么数据呢?
03:29
存什么数据,我就存这个维度的全量的这个数据,OK,比如说在6月14号这一天的时候呢,我就保存一下6月14号的这个维度的全部的这个维度对象的信息,比如举个例子,咱们维度咱们就以用户维度为例吧,那14号的时候,我就保存全部的这个用户的这个14号的状态,那到了15号呢,是15号之后,我这个用户有些人他的状态会变呀,对吧?OK,那也有可能不变,对吧?不管他有没有变,我都把15号的全部的用户的状态再给他保存一份到这个书仓里边来,好,那你想一想,我要是有了15号的,14号的,我还留不留。
04:05
还留不留,是要删了还是继续留着,得留着吧,为啥?因为你得保存历史状态啊,对吧?哎,是这样的,OK,所以说我们相当于就是每天一个全量快照吧,这大家说这是不是保存这个维度历史状态的最简单的一种方式啊,对吧?哎,这就是所谓的每日全量快照表,它是可以用来保存维度的历史状态,因为啥呢?你想啊,你将来比如说我想要哪一天的状态,我是不是就去找哪一天的分区,那就完事了呀,对吧?这个其实很好理解,好了,那接下来呢,我们继续往下看,他说了就是这种方式呢,优点和缺点都很明显,OK,那现在我来分析分析它的优点是什么啊,优点首先就是简单而有效。对不对,后边说了,他说开发和维护的成本低,并且方便理解和使用啊,这个什么意思呢?就是说,呃,我们这种每日全量快照表呢,我们开发起来比较简单,那后边我使用起来是不是也是比较简单啊,对吧?OK,那到底是不是这么一回事呢?咱们从这个开发和使用的这两个角度都去分析一下,那咱们现在先说开发这个角度啊,来大家琢磨琢磨,你说我要是想去做一个这种每日全量快照表,那咱们怎么去做呀?
05:14
首先你这个数据肯定是来自于业务系统的,对吧?啊,来自来自业务系统是不是就得先去同步数据啊,对吧?那所以首先我们需要考虑的问题就是你这个同步策略怎么去选择用哪种。用全量是不是最合适的对不对?OK,那我就直接从业务系统当中,比如说找到用户那张表,对吧,直接把这张表的全部数据,我给他往我们的书仓里边做一次全量同步,同步过来之后呢,我是不是哪天同步的,我给它放在哪天分区就行了,对吧?比如说这是第一天我放在14号分区,好,那到了第二天呢,第二天之后我业务系统的数据是不是可能会变呀,对吧?啊,也不管它变没变,我到15号我再全量的同步一份到15号的分区里,对吧?那到了第第第三天呢,我是不是再同步一下到呃,同步一份到16号的分区啊,对吧,那我要是做这个每日权利坏照表,是不是就这样去做就完事了,对吧?整个过程其实没有什么复杂的逻辑,非常的简单,所以从开发的这个角度上去理解是非常简单的,好,那接下来呢,我们再来看使用这个角度,它是怎么简单的啊,使用那咱们首先得知道啊,就是维度表,我们将来咱怎么用它。
06:16
怎么去用这个维度表,什么时候用维度表,是不是我们将来做各种各样虚求都会用到维度表,对吧?怎样用它呀,是不是就是用事实表跟这个维度表进行关联操作对不对?咱之前是不是都是做需求,是不是都是找到事实表,找到对应的维度一关联,然后一统计就完事了,对吧?也就是我们使用维度表,就是用事实表跟维度表去进行关联,好了,那完了之后,这里边有一个细节大家需要注意一下啊,就是你在用事实表跟维度表进行关联的时候,有一个要求,咱必须得满足哪个要求呢?就是说你得保证啊哪天的事实啊,然后你就让他去照哪天的维度状态才可以。大家琢磨琢磨,因为为因为啥,因为咱们的维度表当中,我是不是保存了每一个维度动向,在历史上每一天的这个状态啊,对吧,对吧,我我有这个人14号的状态,有他15号的状态,有他16号的状态,有他17号的状态,每天的状态我都有,对不对?OK,那这几天的状态是不是可能是不一样的呀,对吧?好,那完之后我用市十表跟维度表进行关联的时候,那我们是不是得选一天的状态啊,对不对?那你到底选哪一天的状态呢?那很显然就是你这个事实是在哪天发生的,我就去知道哪天的维度状态是不是应该是这样的一个原则呀,那啥意思?比如说诶,我现在要统计一个跟订单相关的指标,那我是不是得拿到下单这个实时表的下单记录对吧?好,那假如说你拿到的是15号的下单记录,那完了之后呢,你就得去照维度表15号的状态才行,诶是这样的啊好,那如果说你拿到的是我们这个,呃,最新的一天的这个下单的记录,那你就得去知啥呢?是不是就得知道我们维度表当中最新的一天的这个维度状态啊,对吧?诶是这样的,也就是哪天的事实知道哪天的维度。
07:58
这1.1定要把它搞清楚啊,好了啊,那所以说我们再去使用维度表的时候,咱们大概的总结一下,无非就是这样的两种场景,一种场景是什么呢?就是获取一份全量的最新的维度状态,对吧?让他去跟谁照呢?去跟我们比如说最新一天发生的事实去照,对吧?这是一种情况,那我们还有一种情况是什么呢?是不是就是获取维度表当中历史上某一天的这个维度状态啊,对吧?哎,无非就是这样的两种情况,好,那假如说我们现在做的就是一个这种每日全量快照表,那你想一想,我们去获取全量最新跟获取历史上某一天的历史状态,你说这个容易不容易,很容易,对吧?你比如说我要想从回度奖当中想拿最新的一天状态,那你怎么拿就行了。
08:43
是不是直接找到这张维度表最新的一天的分区就搞定了,对不对?那你要是想获取历史上某一天的维度状态怎么办呢?是不是就找到历史上那一天的分区,直接拿过来就完事了,对吧?因为咱们是每日全量吧,每天的分区都保存了那一天的全量的状态,对吧?你想用哪天直接根据分区字段过滤一下就完事了,那所以说这个维全量维度表,那咱们使用起来是不是也非常的简单,对不对,就是这样的,所以说那这种全量快照表,无论是从开发还是使用的这个角度去理解它都是比较简单的,好,这是它的优点,那它缺点是什么呢?
09:17
缺点很明显,是不是就是浪费存储空间对吧?尤其是什么时候浪费比较明显,比较严重的就是当数据变化的比例比较低的时候,就什么意思啊,比如举例子,那假如现在我买so当中有一张用户表,对吧?用户表当中比如说我存了100万用户的信息,那完了之后呢?呃,我这张表当中啊,每天变化的用户可能只有比如说几千条,也就是说是不是绝大多数的数据都是没变的呀,对吧?那你要是对他去做一个每日全量快照表对吧?相当于你每天是不是都会重复的去存储大量的不变的数据啊,对吧?诶,那这样一来你这个效率就非常低了,OK啊好,那这实际上就是每日全量快照表它的一个,呃,这个优缺点啊,这个其实还是比较明显的,OK啊,好了,那全量快照表大家现在应该基本上已经掌握了,这是我们保存维度历史状态的第一种方案,OK,那其实我可以告诉大家,这种方案呢,其实也是最常用的一种方案啊,为。
10:17
为什么呢?因为它的唯一的一个缺点就是啥,是不是就是浪费存储空间对吧?那那实际上在我们这种大数据的这种环境下,对吧,你浪费一点也还好啊,也还OK啊是这样的啊,那它呃,最显著的优点是就是因为它太简单了,对吧,不论是开发还是什么都简单,那我为什么不用它呢?对吧?所以说实际上呢,呃,在这个实际的操作过程当中呢,这种全量快照的维度表是最常见的啊这样的啊,但是这个拉链表呢,我们也不能不学,因为这个不论是从面试上啊啊,还是说以后咱们开发也都有可能啊,或者有比较大的概率会遇到,那所以这个东西咱们还是得学一下的,而且拉链表呢,它要比咱们上面讲的这个全量化招表要难一些啊,是这样的啊好,那咱接下来呢,就来看一下我们第二一种表叫做拉链表,那首先我们先来明确一下啊,就是拉链表它存在的意义是什么?来看一下我先告诉大家,拉链表存在的意义就在于它是能够更加高效的去保存维度信息的历史状态的,当然这个所谓的更加高效的去保。
11:17
保存维度的,呃历史信息对吧?那是跟谁相比更加高效,是不是肯定是跟这个全量快照相比是更加高效的对吧?那他刚才说了它是缺点是浪费存储空间,是不是它的这个存储是比较低效的对吧?那我们这个拉链表它实际上呢,针对的就是全量快照板的这个缺点,就是为了解决这个缺点才会有这个拉链表这个概念出现啊,这个大家要理解一下好了,那到底什么是拉链表,那拉链表又是如何更加高效的去保存维度的历史状态的呢?我们接下来就一起来看一下啊,来,视频我先停一下。
我来说两句