00:00
嗯,好了,同学们,那现在呢,我们接着往下看,那下边呢,我们要讲的这个概念就是比较重要的一个了啊,叫做拉链表,那接下来咱们就来一起看一看到底什么是拉链表来,那现在我把这个PPT点开,咱一起看一下啊呃,上面呢有一些文字说明,这个咱们先不用看,这个字不重要,大家看图就行了,你就直接看这个图,大家看一看,这就是一个非常非常典型的拉链表,你看一看你从里边你能获取什么信息,就这个表里边的数据你能能不能看懂啊,就是咱们得对数据敏感一点,尤其对这个表得敏感啊,拿到它之后你得能看明白啊,怎么才算把这张表看明白了呢?其实还是之前给大家说的,你是不是得明确它的每行指的是什么,它每个字段的含义是什么呀,对吧,你把这东西搞清楚了,那这个表你就熟了啊,那大家先来看一看这个能不能看懂。大家说这个每行指的这应该是一个什么呀?每行指的应该是一个什么。是一个用户吗?呃,是什么?咱们其实呃一行是什么,可能你一开始是看不出来的,对吧?那所以说你可以先说是看一看列对吧,这两个没有什么绝对的先后,不是说你非得先看行再看列对吧?你可以先把列大概熟悉一下,然后再推测每行是什么,对吧?来,那咱们现在先看列,那列其实前面这几个没什么可可说的,对吧?比较简单,呃,用户的ID,用户的姓名,用户的手机号码,也就是一些用户的基本的属性信息,对吧?这个咱不多说,咱重点看后边,后边是不是有两个列呀,对吧?这两个列一个叫做开始日期,一个叫做结束日期,对不对?开始和结束日期指的是什么的开始和结束日期呢?
01:38
是什么的呢?是手机号呢,那实际上在这儿呢,应该这么去理解啊,就是开始结束日期指的是什么,你必须得明确它的一行指是什么,实际上呢,这张表当中一行所指代的就是一个用户的一个状态。对吧?OK,那这个状态呢,可能是一个历史上的状状态也可能是什么呢?也可能是一个,哎最新的状态,哎应该是这么去理解,那这个所谓的一个用户的状态,咱们怎么理解的,大家都知道,一个用户他是不是可能会有很多的属性信息啊,对吧?当然我这儿列的少啊,只有一个姓名,一个手机号码,对吧?只要它的任意一个属性信息发生了变化,对不对,那它是不是就有一个新的状态啊,相当于是就这个意思,OK,那我们这张表当中一行指的就是一个用户的一个状态,好,那这个数据我们到底怎么去理解它呢?那这个开始日期和结束日期大家应该就知道了,是不是应该指的就是我这个状态的开始和结束日期啊,啊,应该是这么去理解,好,那现在我们把这个数据解读一下啊,这个东西怎么去解读呢?就是说OK,在2019年1月1号对不对,到2019年1月1号这段时间,那一号用户他的状态是不是应该是这样的呀,对吧,姓名叫张三,手机号码是136对吧?OK,那到了2019年1月2号到。
02:55
2019年1月9号这段时间内呢,OK,那张三的状态叫之前是不是发生了变化对吧?OK,他的姓名还叫张三,然后手机号码就变成了137了,对不对?OK,那再继续往下看,那从2019年1月10号开始至,呃,9999-12杠三幺,这是一个什么意思?这是个极大值对吧?那极大值在这儿代表的是什么呀?其实就是至今吧,是这个道理吧,也就是说从这一天至今,它是不是都是这样的一个状态呀,对吧?是这样的啊,OK,那这实际上呢,说白了最后一个状态就是它的一个什么状态,最新状态吧,那前面这些状态都是什么呢?就是它历史状态啊,对吧?OK,好,那这实际上就是所谓的拉链表,这就是拉链表,哎,这一点咱们大家呢,先给它搞清楚好了,搞之后呢,我们继续往下进行,咱往下看,下面呢,我们看一看就是为什么要去做拉链表,为什么做拉链表,其实前面就已经告诉大家了,为什么要做呀,是不是因为拉链表它能够更加高效的去保存维度的历史状态,对吧?好,那我们就来看一看它到底高效在。
03:55
在哪了?来,我把这个PPT点开,咱们一起来看一下,首先同学们啊,那上面也是有文字描述,咱们不看直接看图就行了,字不重要,看图啊好了各位同学,那刚才就提到了拉链表高效高效它肯定是跟那个每日全量表是不是去比它才高效对吧?好,那所以接下来呢,哎,我们就来做一个对比啊,做一个对比,那现在呢,拉链就是左边的这个每日全量表跟右边这个拉链表,它俩实际上保存的是相同的信息,是同的信息,OK啊好,那接下来我们看一看这个拉链表它到底如何高效的,我们先来看一看左边这张表它存的是什么,左边这张表实际上它保存的是不是就是一号用户的所有的状态啊对吧?欧阳啊,你看啊,这个保存的是什么,是一号用户,从2019年1月1号到2019年5月12号,是不是这么多天的这个历史状态,对吧,由于他是什么,是每日全量表,每日全量表,他是不是不管这个人他的今天的状态跟前天状态有没有发生变化,他每天。
04:55
是不是都要去存一份啊,对吧?那所以说一号用户他是不是就从1月1号到五月,呃12号这里边经过了几个月呀,呃,差不多555个多月,100多应该是100多天,对不对,当然是是不是张三的这个信息,那就得保存100多份啊,对吧?那从这个信息我们也能看出来,实际上呢,一号用户从1月1号到哪儿,到5月11号,他的状态他变过吗?
05:18
是不是根本就没没变化,是不是都是一模一样的呀,对吧,也就是在这儿呢,这份相同的数据它就存了100多遍啊OK,那直到什么时候变了呢?直到5月12号的时候,对吧?那这个一号用户他的状态时候发生了变化了,对吧?变化我就存新状态,那就完事了,OK,那这是每日全量表去保存维度的历史状态的一个方案,它就这么去存的,好那接下来呢,我们再看右边的拉链表,那实际上呢,左边相同的信息我在拉链表当中呢,我只需要几条就搞定了呢?两条就搞定了,OK,你看他是怎么搞定的啊,OK,我们先看第一条数据,第一条数据什么呢?是一号用户对吧?张三,那他从哪一天,从2019年1月1号到2019年5月11号,那它的状态是不是都是同样的一个状态,因为他没变过嘛,对吧,那所以说我这儿是不是就只存一份,那就完事儿了,它不像每日全量表那样,你不变的状态,它这是不是会存很多遍,而我这边呢,拉链表是不是只存一遍啊对吧?OK,那这样一来是不是这个效果就非常的明显了,对吧,拉链表就。
06:19
能够以更低的这个存储代价去保存历史状态了,哎,这块大家应该是能想明白了,好了,那这就是拉链表它它存在的一个意义,那它能够极大的减少这个存储空间啊OK,好,那完之后在这儿呢,我再给大家多延伸一句啊,就大家琢磨琢磨啊,就是拉链表,它为什么会叫拉链表呢?为什么会叫拉链表?呃,实际上这个你从网上查资料的话呢,也不太好查出来这个拉链表这个名字到底怎么来的啊,但是在这呢,呃,给大家说一下我个人的这个理解是怎么回事啊,实际上呢,这个拉链表它的英文应该是什么?应该是Z对吧,Zip是就有拉链的意思啊,对吧?但实际上除了这个,除了有拉链还有什么意思?对,还有压缩的意思,但其实你琢磨琢磨,咱们这实际上相当于是对什么呀,是不是对这些不变的这种状态,我是不是进行了一个类似于压缩的操作,对吧,这么多条我是不是压缩到一条里边来了,对吧?所以说我们从压缩这个一这这个层面去理解,应该是更合适的啊,实际。
07:19
也就这个东西我们叫做压缩表,其实也是说得过去的啊,但是呢,大家呢,都管它叫做拉链表,那叫拉链表,咱们也就都叫拉链表就完事儿了啊呃,这个大家稍微的理解一下就行了啊好了,同学,那截止到现在呢,就是拉链表它存在的意义咱们就搞清楚了,那接下来呢,我们再深入的思考一下,就是说从这儿我们确实能看出来,就是拉链表呢,它能够比这个每日全量快照表节省很多的空间,对吧?但是是在所有的情况下,拉链表都能比每日全量表节省这么多的空间吗?是这样的吗?其实并不是,在某些情况下,你用拉链表和你用每日全量快照表去做,其实它俩的存储空间可能也差不了多少,哪种情况下差不了多少呢?哎,对,你就看它这个变化比例对吧,假如说举个例子,我买三当中有一张用户表,那假如说这张用户表呢,我每天变化的比例都非常的高,对不对,也就啥意思呢,比如说我这张表呢,有100万条数据,对吧,那我每天变化的数据呢,比如说有99万。
08:19
条,也就是说99%的数据是不是都会发生变化呀,对吧?那在这种情况下,你想一想,如果我们要是做每日全量快照表,你相当于每天你保存多少条数据呢?是相当于每天保存全量,是不是就是100万呀,对吧?每天100万,每天100万好,没问题,那接下来我们看这个拉链表,拉链表我们保存的是什么?我们保存的是每天新增级变化的状态,对吧?那些不变的我是不是每天不会重复的保存,对不对?那你想一想,我拉链表这边,我每天是不是有99%的会变,那也就是说你是不是得保存99万条的数据啊,对不对,那每天是不是都是99万,每天都是99万,对吧?你跟那个每日全量其实也差不了多少,对吧,诶,也就是说我们拉链表在这种情况下,它跟那个每日全量表其实就差不了多少了啊这样的啊,那所以最终咱们总结一下啊,就是拉链表到底什么时候才会比这个每日全量快照表啊更加高效呢?前面其实已经给出了答案了,说什么呀,是不是在那种数据会发生变化,但是变化的频率或者是变化的比例。
09:19
并不高的这种维度对不对,那它是不是才更加的有这个效果呀,对吧?OK,那这种所谓的变化频率不高,或者是变化比例不高的维度呢,我们称之为什么呢?缓慢变化为,这也是一个术语,大家稍微的理解一下,那什么叫做缓慢变化为呢?就是说我这张维度表当中的数据呢,每天变化的比例比较低,对吧?那这样的我们管它叫做缓慢变化为,是不是也正是在这种缓慢变化为的场景下,拉链表才能发挥它最大的这个作用啊,对吧?诶这个大家理解一下就行了,好了,有同学,那截止到现在呢,这个拉链表它的意义咱们也就讲完了啊,OK,这个完成之后,我把视频停一下啊。啊好了同学,那咱接下来呢,就来分析分析啊,就是这个拉链表咱们如何制作,又应该如何使用,咱们先来分析分析它怎么制作。
10:07
呃,所谓的制作拉链表呢,是不是还是得从数据同步那边开始说起,对吧?哎,那你说拉链表这边咱们要做数据同步,我应该做哪种同步,是全量还是增量。啊,咱们之前做那个每日全量快照表的时候,那没得选对吧,是不是就是全量了对吧?OK,那我做拉链表我还需不需要做每日全量,需不需要不需要了,对吧?因为拉链表它的特点就是啥,不会去重复的同步和存储那些不变的数据,对吧?那所以说对于拉链而言,我们要做同步的话呢,就采用增量同步就够了,每天只同步新增几变化的数据,好那同步过来之后怎么做?对吧,比如说今天我把它的新增及变化的数据拿回来了之后怎么做呢?啊,你像之前咱们做每日全量快照表的时候,你每天把全量的数据拿过来之后,是不是直接往那个表里一个新的分区一扔,那就完事了呀,对吧?那拉链表还能直接这么一扔吗?那就不能了,拉链表你得做什么工作呀?琢磨琢磨,你得琢磨琢磨,你比如说今天的新增级变化拿过来了,对吧?那这是我们数据仓库当中原来那张拉链表,对吧?那你是不是得把这个新增及变化的状态是不是得写到拉链表当中啊,对吧?好,那写的时候你需要做哪些工作琢磨琢磨?
11:15
首先第一个今天新拿过来的这个新增级变化,你是不是得给他加俩字段,因为拉链表当中是不是有俩特殊的字段,叫做开始和结束日期,没问题吧,这俩是不是都得加上,就那我问一下大家,你说对于新拿过来的这部分新增疾变化,它的开始日期和结束日期,咱们应该怎么处理?首先先说结束吧,结束其实没得说,结束是不是肯定是极大值,为啥?因为你今天的新增级变化,甭管是新增的还是变化的,那是不是都是今天的最新状态对吧?是最新状态是不是结束日期就得是9999极大值对吧?OK,那所以说结束日期没问题,那开始日期呢?应该是哪一天,是不是今天就是今天啊,对吧?因为你今天的新增级变好了,你是不是就是从今天开始了对吧?所以开始日期就是今天对吧?那所以说这部分数据咱们需要先给它处理完,加两字段,加完之后,那这一部分我们应当怎么办呢?是不是得插入到拉链表当中对吧?因为拉链表当中我们每行是不是就是一个状态对吧?你今天的新增级变化都是新状态,新状态是不是就要写到咱们这张表里呀,对不对,OK,那接下来还要做其他的工作,对,你是不是还得修改一些数据啊,对吧,那修改哪些数据呢?很简单,你想你今天有什么有新增的,有变化的,对吧?有变化的就意味着什么?
12:27
就意味着原来的某些最新状态已经不再是最新状态了,它已经变了嘛,对吧?OK,那所以说你就得找到你变化的那个记录所对应的用户,你得把它上一个最新状态的结束日期是不是改一下啊,对吧,他就不能再是9999了,因为一个人只能有一个最新状态,也就只有一个状态,他的结止日期是999对吧,那剩一个你得给他改了,那改成啥呢?啊,这个通常是改成前一天的日期,那就表明什么呢?表明我这个状态在前一天就已经结束了啊,对不对,他的,哎,这个周期就到头了啊就这个意思好了,那这实际上呢,是我们去制作拉链表的时候,咱们要做的一个大致的工作,其实从刚才咱们这个描述大家应该能够感受出来,拉链表这个制作起来是不是有点麻烦。
13:13
没错吧,他肯定是要比那个每日全量快手边要麻烦多了啊,这个一定要理解一下,好,那制作呢,咱们就暂时先说这么多,那至于这里边具体怎么去做,这个circlec考到底怎么写,呃,这个等后边咱们真正做到拉链表的时候再说,咱们现在先有一个大概的感受就可以了啊,你就知道这个比较麻烦就行啊。好,那接下来我们继续往下看,下边呢,我们再来看另外一个话题,就是拉链表咱们做好之后,将来怎么用对吧?OK,怎么用,怎么用,那是不是拉链表它也是维度表了,对吧?既然是维度表,那我们用它的方式就是干啥?是不是就是用事实表跟维度表去做关联呀,对吧?那我关联的时候我同样要满足一个要求,什么要求来着,哪天发生的事实是不是就去照这个维度在哪一天的状态啊,没问题吧?好,那现在问题就来了,我们怎样从拉链表当中去获取我们想要的那一天的状态?
14:04
对吧?咱们想要的那个状态无非也是两种情况,一种呢,就是获取的最新一天的状态,还有一种就是获取什么呢?是不是历史上某一天的状态,对吧?好,那现在咱们就来琢磨琢磨,你说对于拉链表而言,我们怎样去获取咱们想要的那一天的状态,我们先用最新的这一天举例去说明,那假如现在有一个拉链表放在这儿了,对吧?我想获取一份全量的最新的状态怎么呢?那对,其实很简单,结束日期等于9999,是不是只要用这个条件去过滤一下,那就完事了呀,大家说是不是这样,肯定是啊,为啥?因为是不是一个用户或者一个维度对象,它有且只有一个状态,它的结束日期是999啊,对不对?那所以说我们只要用结束日期等于九九杠12杠三幺这样的一个结大值,是不是就能把这个每个人的最新的状态过滤出来,对吧?那这就是我们获取最新状态的这个思路,相对比较简单,好,那现在关键问题来了,关键应该是获取历史比较麻烦了,对吧?那现在假如说给了你一个拉链表,我比如说想获取历史上某一天的维度的状态。
15:04
哎,那大家琢磨琢磨,我应该怎样去获取。啊,你像你要是像咱们之前那种每日全量快照表,想获取历史上某一天,你想获取哪天我就拿哪个分区,是不是就完事了,那个简单,那拉链表怎么获取,好好动动脑筋想一想。啊,这里边肯定会用那个开始和结束日期去过滤吧,对吧,OK,关键是怎么去过滤,想一想看能不能想到啊。比如说我就想获取历史上某一天,比如说2020年对吧,比如说1月1号,我就想获取这一天的历史状态啊,怎么去获取。你要知道啊,咱们每一个状态都有一个什么开始和结束日期,对不对,OK,你你其实要那一天的状态,你只要保证一个什么样的条件,你就能,哎满足咱们这个日期了。对,其实很简单,你只要保证那个状态啊,它的开始日期哎,它得小于等于你要的日期,并且结束日期呢,得大于等于你想要的这个日期,或者换句话说,你只要保证你想要的那个日期是位于那个状态的开始和结束日期之间的,那这个状态是不是就是你想要的这个日期的,那那天的状态啊,应该是这样一个逻辑吧,OK啊,那所以这个公式其实相对比较简单,那就是这个开始日期小于等于你想要的日期,并且结束日期大于等于你想要的那个日期,OK,这样一个过滤条件,就能拿到我们想要的那个时间点的历史状态啊,就是这个意思啊好了,那各位同学,我们现在继续往下进行,那下面呢,咱们看一个具体的例子,看看是不是那么回事儿啊,那首先大家看这这其实就是一个非常典型的拉链表,对吧,咱们先来熟悉一下这个表,看大家能不能看懂啊,首先这里边呢,一共有几个用户的状态,几个用户。
16:50
其实只有四个用户对吧,这是一号用户,二号用户,三号四号,那这个二有两条,这意味着什么呀?意味着他有俩状态呗,对吧?哎,是这样的啊好了,那这是一个简单拉链表,那接下来呢,我们来往下看看,这有一个要求,这个要求是什么呢。
17:04
我们想获取2019年1月1号的历史状态,对不对?那所谓的历史切片就是获取那一天的全量的历史状态,我们称之为一个历史切片啊,OK,那接下来继续往下走,来咱们看一看,你要想获取这一天的状态,那你的过滤条件怎么写,是不是就按照文档当中这么写就行了,对吧?开始日期小于等于你要的日期,结束日期大于等于你要的那个日期,好,那完之后呢,我们返回的结果是什么?就是这个,来我们看一看他返回的结果是不是我们期望的那个结果啊,来咱们看一眼,首先他把一号用户张三这个状态返回出来了,那这个应不应该出现在结果里边呢?用不行,咱来分析分析啊,首先一号用户张三的状态,他是从1月1号开始的,至今是不是都是这个状态对吧?那我想要的是1月1号的状态,他应不应该返回呢?应该对吧?OK,那继续往下走,那对于二号用户呢,二号用户注意他有俩状态啊,那我只要哪一天呢?只要1月9号1月1号的对吧?那你看一下他是不是俩状态,这俩开始和结束都是什么样的,这个是1月1号到1月2号是这个状态,那从三号到至今是不是都是这个状态,我们要一。
18:05
号的是不是就应该返回李四这个状态,所以这个也是对的,没有任何问题,好,我们继续往下看,那下边呢,我们再来到三号用户,他把王五给返回了,这个对不对,这个对,这跟一号用户是不是一样的情况,对吧?这个没什么可说的,然后注意观察,他把四号用户返回了吗?并没有对不对,OK,为什么没返回的,你看一下四号用户他是,呃,只有一个状态,而且是从哪天开始的,是从1月2号开始的,那其实从这能看出来,这个四号用户他应该是1月2号的一个新增用户吧。对不对,在1月2号之前是没有他的状态,那说明他是1月2号新增的,那我只要1月1号的人呀,对吧?那所以说四号我是不是本来就不应该出现,对吧?那所以说这样一来的话,那咱们这儿通过这个过滤条件返回的结果确实就是咱们想要的,也就是说我们这就能够证明咱们这个过滤条件呢,是没有问题的,诶这一点大家给他搞清楚就行了,好了,那这就是咱们使用拉链表的方式,下边还有一个例子,咱们就不再多说了啊OK啊好了,那最终咱们总结一下啊,你会发现啊。
19:03
就是说我们使用拉链表对不对?OK,虽然用起来稍微的麻烦一点,但是咱们是不是能够实现跟那种全量快照表一样的效果,对吧?就是我想获取原量最新我也能拿到,我想获取历史上的某一天我是不是也能拿到对吧?也就是你在使用这两种秒的时候,你能实现相同的效果,但是呢,哎,它俩底层的存储呢,就不一样了,哎,每日悬量外照表会存储大量的重复数据,而拉链表呢,不会存储这么多的重复数据,哎,但是呢,拉链表我做起来用起来都简单,而拉链表呢,就是每日全力快照表啊,用起来做起来都简单,但是拉链表呢,我用起来,我制作起来是不是都比较复杂啊,对吧?那他们的优缺点呢,都是相对的啊OK啊,那最终总结一下,那我们最终到底用哪种表多呢?还是用每日全量快照表更多一点,那拉电表呢,相对用的比较少一点啊呃,然后后边呢,我们呃整个B达这整个维度层呢,我们到时候会建呃六张维度表,我们会建六张维度,然后呢,有五张是每日全量的,然后还有一张呢是拉链表啊,咱们只有一张拉链表。
20:03
这个大家理解一下就行了,好了,完成之后我把视频停一下。
我来说两句