00:00
好,那在这儿呢,我们给用户维度表呢,嗯,咱们做了一个拉链,做一个拉链表啊呃,然后咱们先来分析分析啊,嗯,先告诉大家,就是我们什么情况下才会用这个拉链表。啊,什么情况才会用拉链表。啊是这样的,大家看啊,呃,我们这个用户维度表是用户维度表,它本身它是一个维度表对吧,那维度表我们通常有这样的特点啊,就是数据量不大,并且呢,数据相对稳定。但是他每天也会改,也会改啊嗯,也会新增,但是呢,我每天修改的比例其实不是那么的高,我一天呢,可能10万条数据,我可能只有几百几千条改。对不对啊啊,我不会这个每天这个修改很多啊,修改的比例哎不是那么高,那这是咱们从呃一天来说,那如果从整个这个从这个时间这个角度去看的话呢,也就是说我们每个用户啊,修改数据的频率都不是那么的高啊,不是说我一个人我这个一天修改五次啊,其实不是这样的,你就好比你你你你举个例子啊,咱们自己是不是使用了很多APP啊,你你使用APP,你那个个人信息你会频繁的修改吗?
01:14
不会,我可能半年呃,可能几个月我才改一次,对吧?啊是这样的啊,那所以这个修改频率不是那么高,这是一般情况下我们这个维度表它的这个特点啊,就是数据量不大啊,然后呢,数据相对稳定,呃,但是稳定归稳定,但其实每天也有可能会改,也有可能会新增啊,只不过就改的频率没有那么高而已啊这是维度表的特点啊,维度表特点那基于这样的特点呢,我们维度表通常情况下,咱们采用的同步策略都是什么呀?啊,都是全量同步,因为它数据量不大嘛啊,每日全量啊,然后财运全量同步之后呢,我们到了数仓里边,那这张表咱们就叫什么表,就叫每日全量表,这个没错吧,啊是这样的啊,这是咱们通常的这个情况下的维度表,但是呢,有些维度表啊,呃,它这个数据量还也比较大。
02:01
啊,比如说谁呢?比如说咱们这儿这个用户维度,像这些东西啊,是不是相对就比较灵活了呀,对不对,你这个用户维度表示这个数据量大小,这跟什么有关,是不是跟咱们这个,呃,公司的这个用户群体有关呀,我们公司用户基数本身就大啊,我百万用户啊,或者千万用户对不对,那你这样的数据量不是也不小了呀,对不对,每天百万级的数据,千万级的数据很大了,那所以说这个如果说你也去做这种啊,每日全量同步的话啊,这个表呢,做每日全量表,那是不是这样一来,咱们这个存储空间占用就比较大了呀。而且你这个效率呢,是极低的。啊,为什么是极低的呢?哎,你要知道啊,咱们这种维度表通常情况下每天修改的这个比例不是那么的高,对吧,不是那么的高啊,那也就是说你每天导过来的这个全量数据啊,其实里边是不是绝大部分的数据都是什么样的呀。都是没变的对不对啊,都是没变的,也就是说你这个相当于导了很多没用的数据啊,那所以说这个很显然这样是不好的啊,所以说什么时候用这种所谓的拉链表呢?啊,就是说哎,假如说我们这个维度表啊,数据量很大啊,不方便做每日全程同步,这时候呢,我们就可以用什么呀,用这种每日新增及变化啊,新增级变化,那前面讲过每日新增及变化我拿回来之后呢,咱们这个数据不能直接用,对不对,我得怎么办?我得将这个每日新增级变化和咱们原来的数据是不是得做一个所谓的整合呀,对不对,这个所谓的整合整合成什么呀,整合成咱们这个所谓的拉链表啊,就是这样一个东西啊,也就是说每日新增级变化啊,这样的这个维度表呢,我们可以做一个拉链表。
03:44
好啊,那做拉链表在这儿呢,我们主要想实现什么样的功能啊,咱们做拉链表为了解决什么样的痛点呀?啊,为了解决什么样的问题啊,是不是为了解决咱们那个数据啊,重复存储的问题啊,对不对啊,也就是说咱们之所以采用拉链表,是因为我如果做全量表的话呢,我这个相同的数据,我是不是重复的太多了呀,对不对,那我不想存这么多重复数据,那我就可以做一个拉链表。
04:13
也是你做拉链表,呃,肯定从这个存储空间的这个占用,呃,这个角度去考虑的话,它是不是能够减少存减少存储空间呀,对不对,来咱们看一看它到底是怎么减少的啊,来咱们往下看。先来看一看什么是拉链表。咱把这个看了之后,你就知道它是怎么减少存储空间的了啊,来点一个PPT打开。嗯。哎,稍微等会儿啊啊,我点了,但是它比较慢啊,好已经出来了。这就是拉链表啊,这个介绍呢,咱不用看了,直接看下边这个图啊,图一下就明白了,所以拉链表呢,要明确首先得明确啊,那这拉链表当中一行数据指代的是什么?我们看任何一张表,你们都要先考虑这个问题啊,一行数据是什么?
05:02
你看这个拉链表里边的一行数据是一个什么呀。能看出来不?是一个用户吗?咱们虽然是用户维度表对吧,用户维度表里我说一行数据我是一个用户吗?不是很显然,这三行是不是都是一个用户啊,那一行数据应该是一个什么呀。应该是一个用户他的一个状态。一个状态啊,你看啊,这是我们张三这个用户在哎某一段时间,我的手机号是136的,对不对啊,那这个过了一段时间呢,我改成137了啊,后边1147了,你看是不是一行数据,相当是我们用户的一个状态呀,对不对,OK,咱们先把这一点明确,明确之后呢,我们看这这种拉链表当中,它的字段是什么样的啊呃,首先前面这些字段就是我们普通的用户维度表当中字段。啊,用户的ID姓名姓别手机号地址等等等等那些没有写啊,省略了啊,大家知道这个意思就行啊,然后呢,除了这个长,就是它普通的那个维度字段之外呢,我们拉链表当中会有两个时间字段啊,一个叫做开始日期。
06:08
一个叫做结束日期啊,那这个所谓的开始和结束指的是什么的开始和结束啊。是不是这一个状态的开始和结束日期啊,对不对,那也就是说我们通过拉链表呢,能够知道来我们张三这个用户呢,他在呃,2019年1月1号到20年1月1号,我的手机号是136的,那从2019年1月2号开始到1月9号,我的手机号是137的,对吧?那从2019年1月10号开始,然后到9999,诶这个东西是啥呀。哎,是不是至今呀,相当于就是啊,就是从1月10号至今是不是都是147的啊,就是这个意思啊啊,那这就是我们所谓的拉链表,拉链表就长这样。啊,就长这样啊,他得明确里边一行数据指的是一个用户的一个状态啊,然后呢,它的字段有什么呢?有两个比较特殊的,就是开始和结束日期,开始结束指的是什么?是这个状态的开始和结束日期啊这点咱明确啊,这就是拉链表。
07:10
啊,那我们一会儿要做的就是一个这样的表啊,然后咱们现在已经清楚知道了拉链表长什么样子,那接下来咱们分析分析啊,咱们刚才说了,拉链表是不是能够降低咱们这个存储空间的占用啊,对不对,你看它是怎么接,怎么占用,怎么降低的啊,怎么降低的,来咱们分析分析啊,怎么降低。咱们思考一个问题。啊,如果说我们现在在买SQL当中有一个用户。啊,这个用户呢,不叫张三叫李四,假如说啊叫李四,那李四呢,他这个状态啊,自从他注册之后就没改过啊,我手机号啊地址什么都没变过,对不对啊,有这样的用户应该有很多吧?啊有很多,那你像这样的用户,如果说我们不采用这个拉链表去存储,那我们采用什么,采用每日全量表去存储。啊,那你说这样的用户,你说你在出仓里边会存储多少份啊。
08:04
咱们驻仓一般情况下保留半年或一年的数据,对吧,那假如咱们就按照半年去算,你按半年算这样的一个不变的数据,你要存几份。每日全量吧,存多少份啊,一天一份呗,一天份就是180份对吧。能理解吧,啊,180分啊,那假如说你要用拉链表去存储呢,拉链表里边一行数据是不是就一个状态,那这个人他是不是从始至今就只有一个状态没变过吗?那所以它是不是只存一行就够了呀?啊就存一份,那所以说你看啊,呃,一个是存180份,一个是存一份,那这个数据量是不是差的就太多了呀,所以说很显然这种拉链表呢,我是能够啊,极大的降低咱们这个存储空间的占用的。啊,而且你要知道这种拉链表呢,一会儿你就会发现啊,这种拉链表你使用起来和我们那个全量表没啥区别,全量表能实现的这个功能,拉链表全都能实现,然后我拉链表呢,哎,还能够减少存储空间的占用,哎,那拉链表是不是听着挺好啊,但它唯一的缺点是什么呢?
09:07
很麻烦,就是你需要这个做的这个工作比较多,你那个SQL比较麻烦,对吧,你你看你全量表多多多方便呀,对吧,每天直接从买SQL里边把数据全拿过来,拿来之后往这个分区里一扔完事了,对吧?啊很很简单,但是拉链表呢,它唯权就是麻烦一点啊,拿点好了,这就是拉链表的这个基本基本的一个概念啊好了,接下来咱们看一看啊,咱们怎么去做这个拉链表,那下边呢,有一个啊,就是为什么要做拉链表。啊,为什么要做蓝表啊?为什么要做呀?刚才咱不是分析过了吗?对不对,咱把这个点开嘛,看一下文字吧。啊,已经分析过了,为什么要要要做蓝表,是因为啊,我们有些这个维度表本身数据量比较大,对不对啊,然后呢,它每天啊既会新增也会变化,是呢,它新增及变化的比例很低啊,很少啊,我可能修改的数据呢,只占这个1%,甚至0.5%等等等这样的啊,所以说呢,这个比例很低,我每天都做全量同步的话呢,这个有点浪费存储空间啊,效率比较低啊,对吧?那所以说这种情况下呢,我就不做全量同步了,我做什么呀,做每日新增级变化,同步每日新增级变化,那每日新增变化呢,到了这个数仓里边,我得把这个新增级变化,我得给它整合起来,融合成什么呀,整合成咱们这种拉链表。
10:24
啊,就是这种情况下,咱们采用拉链表啊,所以说总结一下,那拉链表它适用于什么样的情况呢?适用于首先这个表的数据量啊得比较大。其次呢,它每天的数据会发生变化对不对,哎,也会新增,但是呢,我变化的比例是哎比较小的,变化比例比较小啊,那如果说从咱们这个时间这个角度去考虑啊,就是相当于我们用户啊,我们修改的这个数据的频率是比较低的啊,哎,频率比较低,也就是我变的是比较慢的,我不会每天一就是这个状态,一天变十回,我可能半个月才变一次。那所以说这种维度呢,我们有一个专业的术语叫做缓慢变化为啊缓慢变化为什么叫缓慢变化为啊啊就是我这个数据呢,会不会变,会变,但是呢不会哎,变得很频繁啊,我这个很长时间才会变一次,这种叫做缓慢变化为啊缓慢变化为大家呢,把这一点搞清楚就可以了啊呃,最终总结一下,拉链表适用于啊数据量比较大的维度表,那其次呢,数据它变得比较慢啊,叫做缓慢变回,其实其实一般情况下,咱们那个维度表啊,那个数据变得都比较慢,都不会非常快啊好,那咱们把这一点搞清楚就行了啊啊这是为什么要做蓝量表啊,咱们搞定,那接下来往下走,呃,下边呢是如何使用拉链表,对吧?那咱们还还没有到如何去做拉链表这一步啊,那咱们来看看吧,如何使用拉链表。
11:49
呃,这有几个图啊,咱们其实现在先不用去考虑如何使用拉链表,咱们就来先琢磨琢磨如何使用咱们那种普通的维度表,普通维度表就是啥全量维度表呗,啊,全量维度表咱们怎么使用啊。
12:04
怎么使用,其实使用全量维度表的时候呢,我们一共就俩场景,一个场景就是获取全量的最新数据,对不对?那还有一种场景是啥呀?获取历史上某一天的全量数据对不对?那怎么怎么用啊,获取全量最新怎么办?直接找到这个全量维度表,拿到最新一天的分区,不就是全量最新对吧?因为你这每日全量吧,啊搞定,那历史上某一天呢?拿到历史上那一天的分区拿过来是不是就是历史上这一天的全量数据。是不是搞定啊就怎么用啊,那同样的拉链表,咱们的使用场景其实也是这样的两种啊,也是这样,要么就是获取最新的全量,要么呢是获取历史上某一天的全量啊,是一样的,那我们看看拉链表怎么去实现这样的两个这个使用场景啊,来我们先看第一个。在这儿呢,他说这个通过什么玩意儿,这个咱们先不用看啊,先不用看,我们先看,按照我这个思路去走啊,呃,咱们先看第一种场景就是获取全量最新。
13:02
啊,这是不是给咱们摆了一个拉链表啊,这有一个拉链表,我现在想获取咱们全量的最新这个,呃,用户的这个状态。啊,全量最新怎么获取。拉链给你放这了怎么办?怎么会全量最齐啊,是不是用结束时间去过滤一下就行,只要结束日期等于9999。你获取的是不是就是全量的最新数据啊,首先9999肯定都是最新,然后大家又都知道我们一个用户是不是只有一个状态的结束日期是9999。对不对,那所以说你是不是获取的是全量的最新的呀?啊,OK,那这个没问题啊,那这个搞定之后呢,我们再来看,呃,另外一个场景,另外一个场景呢,就是拿到拉链表,我想获取历史上某一天的全量的那个状态,对吧?啊,那看看这个怎么获取,这就告诉我们了。啊,看一下啊,他说通过什么?通过生效开始日期,就是开始日期小于某个日期,并且结束日期大于等于某个日期,得到你这个某个日期的全量数据。
14:11
啊,你看这个咱们能理能不能理解啊。看下边例子吧,看这个有点有点有点生涩,对吧,咱们看例子。例如我现在呢,想获取2019年1月1号的全量的这个数据。啊,2019年1月1号的全量出去,那咱们就把这个公式拿过来往里边套呗,对吧?往里套怎么办?Select星,From user in four where,是不是开始日期start date小于等于这个1月1号and end date大于等于1月1号,是不是就往里边套对不对?那你看它所返回的结果,那就是啥?就是这部分,这就是1月9号的这个选量数据。诶,那这个东西咱们能不能理解啊大家。这好理解吧,这其实你光这么看这个表,其实可能不太好理解啊,就是你要画一个什么就好理解了,你画一个时间轴。
15:06
啊画一时间轴,比如说这个呢,是一个横轴时间轴啊,那这个时间轴呢,假如说我这儿呢,有一个用户啊,比如说就是一号用户吧,就是一号用户,那一号用户呢,我可能啊,我从开始到现在我经历了哎好几个状态,比如这是第一个状态,这是第二个状态,这是第三个状态,这三个状态的起始和结束日期分别是多少呢?比如说这个是1月1号,那这个呢是1月9号,那这个是开始就是1月10号了呗,对吧,那这个呢到一月哎20号。啊,那这个开始多少,一月21对吧,那这个到一月30,那比如说我经历以下的这样的三个状态,对吧?每个状态是不是都有一个自己的开始和结束日期啊,对吧?那现在我想获取一号用户的啊,1月15号的状态。那你说怎么着,你说一月出二到的肯定是哪个。肯定中间那个对不对,那中间这个你看啊,你这个日期和中间这个状态的开始和结束日期有什么关系,是不是正好就是1月15号。
16:06
大于等于。1月10号这个开始日期小于等于1月20号的这个结束日期啊,这是不是就是这么去获取,所以这个公式呢,是没有问题的啊,就是这么去获取。啊,就这么获取,也就是说你想获取哪一天的数据,你的过滤条件应该是开始日期小于等于哪一天,并且结束日期大于等于某一天,能理解吧,把这点搞清楚啊,那这个就是啊,咱们这个使用拉链表的这个方式,两种途径啊,两种两种场景,一种场景获取全量最新,那就是end date等于999就完事了啊,那如果说想获取历史上某一天的,那就用这个公式就行了,就往里边套就可以了。啊,就是这样的,你看拉链表它是不是能够实现跟我们那种全量维度表的相同的功能啊,对吧?啊,相同功能就是获取全量最新以及历史上某一天的我这个拉链表都能获取啊,所以说它这个还是比较不错的啊啊这就是拉链表,下边还有一个小例子啊,获取一二号的咱们就不看了啊,都是一样的啊啊这是如何使用拉链表,来,咱们把视频先录。
我来说两句