00:00
嗯,好,接下来我们来看一下啊,4.4.14用户维度表,比如说DW层最后一张核心的表,那这张表呢,处理的是要拉链表啊,又有一个新的名词啊,拉链表呢,在日后的这个面试过程当中啊,啊问到的非常多啊,因为就是因为各大家数仓公司,做数仓的这个公司他都会用到这种。拉链啊拉链表对七天连续三天。你们讲过呀,能这么厉害吗?这都讲过,那行,那你要讲过,那你们无敌的存在啊,行,那我来先看看啊,那那就你只要把DWD层冲破的话,那剩下的事都简单了啊,你只需要把现在这个。嗯,搞定。啊,挺好玩的啊,那那那稳稳的,那大家就稳稳的了啊,所以说你看马上15K就要到手了啊,再努努力啊。啊,用户表中数据的每日既可能有新增,也有可能有变化。对吧,哎,新增的变化,那用户表当中每天有新增的数据,也有这个变化的数据,比如说这个用户这个名字发生了变化,用户这个手机号发生了变化,用户这个性别发生了变化,这都有可能,对吧,但是呢,这种频率修改的频率并不高。
01:17
属于这种缓慢变化的维度,记住了,用户拉链表是采用的是啊,处理的问题就是缓慢变化维度,简称叫缓慢变化维。啊,缓动变回,那此处呢,就是采用拉链表来存储用户的维度信息。这块涉及到这个面试题,面试官怎么问呢?一般会这样问,哎,给你一个描述了一个场景,说有一张表啊,这张表呢,它不准发生变化。它就是这个偶尔一个月变一次啊,或者两个月变一次这样的一个力度,那我来如何用什么技术来解决这种问题,在书场里面,其实它考的就是你要用拉链表来解决这种缓慢变化的事情。就他那,当然还有一些面试官比较简单粗暴,你们公司用不给我拉了表怎么做的?
02:05
哎,那这也是单刀直入啊,都可以哈,行,不管他怎么说,反正你会就行,嗯,往下来看,首先看一下什么是拉链表,光一看这个拉链,大家这个可能就是衣服啊拉过链对吧?啊,别的这个拉链好像好像没没感觉过。来看一下什么叫拉链呢?啊,拉链表呢,记录每条信息的生命周期。它会记录着你的任何一个细小的变化,就像这个手机号,下面这张表的手机号,比如说这个张三呢,这个手机号在一月2019年1月1号的时候是这个号。到了19年1月2号的时候,切换到了这个手机号,一直持续到了一九年的1月9号。这种事情可能发生吧,对吧,然后之后呢,到了这个1月10号的时候,又更换了一个手机。
03:04
一直用到现在。这就是一个用户的一个状态,手机号的一个状态是吧,那这张表里面我就记录了这个手机号的整个全流程变化,用三条日志。分别是1月1号啊,他是这个状态,然后1月2号到1月9号是这个状态,1月10号到这儿是这个状态。他是记录了这个手机号的生命周期的全流程。啊,一旦一条记录的生命周期结束,就开始一条新的记录,比如说这个生命周期结束,开始一个新的,并把当前日期放入到生效开始日期,这不是当前日期嘛,今天是1月10号啊,结束啊,如果当前信息自己有效,生效日期填一个极大值,极大值,那这个表示永远也达不了的。这是行业内标准哈,一般的通常情况下就放一个啊9999永远也到不了嘛,啊这一行和上一行啊,对上对行,那这个呢,就是拉链表,拉链表就长这样,它记录了生命周期的全流程变化。
04:10
任何一个细小的变化,在这张表上都能够看到,这是拉链。那有同学说了这个这有啥用啊,那我没没有必要,有的同学说咔咔,我就关心1月10号什么状态,那我就来一个全量就行了呗,全量直接覆盖那1月10号来了啊,这不合适啊,因为这里面是有这个变化的,这时候我们用拉链表来解决这种缓慢变化的。知道什么是拉链表之后呢?来看一下什么为什么要做啊?嗯。那为什么要做拉链表呢?拉链表适合于数据会发生变化,这是第一个前提哈,数据一定是要发生变化的,不变化的还记得要要用什么吗?数据如果不变化,我们做的什么?
05:04
叫增量,然后呢,见的表叫事物型适时表对吧?哎,事物型事实表的特点呢,是一旦产生就不会发生变化啊,那其他的话,只要它发生变化,还有个特点,是不是这个大部分都会变化呢。哎,不是啊,不是大部分都会变化啊,它是一个缓慢变化的。最典型的就是一个用户的信息,他注册完之后,它会很,就是这个变化的一个周期啊,频率啊非常低。啊,反正我呢,像那个在这个京东啊,或者淘宝上注册那些账号,新店里面我填的啥我都不知道啊,我很少去改那些东西啊,有时候没有必要,除非是手机号换了啊,要进行购买那个新的商品的时候,我可能会更新一下手机号啊,好啊,比如用户信息会发生变化,会发生变化,但是呢,每天的变化的比例并不高,你数据量没有那么大。如果数据量有一定的规模,按照每天全量的话方式保存,这个效率比较低,为什么说每天全量这个效率比较低呢?
06:09
那你想想哈,就还以这张表上的为例,这张表里面三条记录就反映了这个用户发生了三次变化的一个状态,对吧,那如果你按全量表记录的话。全列表你怎么记啊,1月1号这天一个全量啊,1月1号的时候它是这个手机号,然后到了1月2号的时候,你是不是还得来个全量,那整个这块就是二到九每一天一个全量。二号三号四号五号六号七号八号九号,每一天一个小量,然后到了这个1月10号的时候。每天学量,那一直到今今天,今天是2020年了吧,你说一年的数据。整整一年的数据,每天都要带着这个,张三的手机号是这个。但是你说这有用吗?对我们来说有用吗?这是365条,然后再加上几个月,再加个100天吧,一共加个100天,比如说我们一共记录了,假如说465天,一共记录了465天,就反映了张三变化了这么这么两项。
07:15
那效率太低了,对吧?啊效率太低了哈,那你说比如说用户,呃,1亿的用户,像那个淘宝啊,1亿的用户你乘以365天,那每天一份这个用户信息,而且它基本上就是不怎么变化,你像我们这个就是不怎么变化。完全的一个浪费存储空间。啊,那么那这样的话,我们就考虑,既然你不怎么变化,那我就把你只要你发生变化的时候给你记录下来,不发生变化我就不记了呗。就一直维持这个状态,一直往前走。哎,所以说这就是为什么要做这个拉链呢,原因就是因为它解决了这种呃,全量的效率低下。啊,效率低下,如果你这里的数据啊,经常性发生变化,你这里这个这个这个手机号一直发生变化,每天都要变化,那你就不如说全量了啊记住了,每天你要都发生变化,难道你你不如来全量了。
08:07
对吧,你相当于每天这里面就要来一条。啊,要不你要来一条。每天一条,每天一条经常变化的,那就做全量了,只有这种缓慢变化的才有做这个,呃,拉链表的一个价值所在,争取存储空间。再往下。那如何使用拉链表呢?来看。这呢是对应的拉力表啊,拉表这个哈,这个上面这个是拉表,这里面记录了这个张三啊,他的名字是这个没问题,1月1号到现在啊李四,李四呢是1月1号到1月2号,这个期间叫李四,到了1月3号的时候呢,突然间切换到叫李小四。
09:03
啊叫李小四,然后一直到现在李小四啊,然后王五赵六对吧,一张用户表,那现在呢,我要干什么呢?哎,这个拉里面怎么用,日后的时候啊,它会记录了某一个时间点的一个数据切片。比如说我就想查看一下,呃,在1月1号。在什么呢?在2019年1月1号的时候,李四就说他这个二号用户。他叫什么名字对吧,那我就可以把它查出来,那怎么查呢?哎,你想查哪一天的历史的切片,就是当前这个二月这个1月1号这一次课。它这个拉链表里的所有的数据的状态,那就是它的start time开始时间小于它,你从这里面去过滤啊,你看它开始时间小于1月1号的有谁呀,小于等于哈,有。有它小于等于,它不小于等于,它小于等于。嗯,它也不小于等于对吧,啊,它也不小于等于,你这三条能过出来,然后再后面加上一个an time得大于等于,1月1号它大于等于。
10:09
它呢大于等于1月1号,它大于等于,所以说你最终过滤完的话,就只有这三条,那这三条呢,就是代表了1月1号的时候,张三叫什么名,李四叫什么名,五叫什么名,包括他的一个状态。啊状态那以此类推哈,那如何讲获取一个1月2号这一时刻。啊,某一时间点这个这里面拉列表里的一些状态,那也可以啊,就是开始时间小于它,And time大于它啊,大于等它就行了,那你看一这个开始时间小于它的。小于一号小于一号小于。那这个呢,李小四李小四不小于它小于它小于啊,然后后面这个呢,是大于等于一二号大于等于一二号大于大于大于大于大于。
11:00
对吧,那这里面满足条件呢,就只有这个这四条,这四条就能够剥离出来。就是这么一个情况,也代表了1月4号这一时刻,这里面哦,增加了一个兆六。啊,增加照料,比如说这里面有这么多信息,比如说这就是啊拉链表日后的一个使用啊,方便你去一个查询过滤,它代表的叫一个历史切片啊,历史片某一时刻,这里面表里的信息的一个状态。那再往下拉链表的一个形成过程。你说怎么来的,这个表怎么做?首先看啊,首先看。2019年1月1号,假如说第一天哈,用户的全量表,用户表里面有这个用户ID和用户名称这两个时段。
12:02
那怎么把这个用户表变成这个拉链表呢?这是我们关心的啊,因为我们正常这个用户表里面没有什么开始时间,结束时间,没有这些东西,那只有的是这个用户ID,用户姓名,怎么办呢?首先第一步初始化拉链表。初拉的表,比如说初始化拉丁表的时候呢,是就等于最开始的时候,就是1月1号,一定从这号开始,选择某一天开始哈,那有可能是你数仓刚建立的时候,第一天那天作为开始之间,也有可能呢,是你出仓提前呢,已经把这个用户啊已经注册好了,突然间呢,这个老大说我们要做一个用户拉链,那这时候呢,一次性也可能导入过来一堆用户的信息,这都有可能完,总之呢,也得有一个开始时间。存在这里面,那这个怎么做呢?只需要把书仓里的所有的数据导过来之后。在他末尾加上两列。两列分别是它的开始时间和结束时间。
13:01
这两列补上,开始时间呢,就是今天这个日期,结束时间是一个永远也达不到的值,999。这是第一步,好,第二天到了第二天的时候,那这里的用户表呢,有可能会发生变化。对吧,啊,有可能发生变化啊,谁发生变化呢?用户二发生了状态的一个改变。你这里面是李四,我发生了改变,变成了李小四。同时在这个用户表里面,我又增加了两个用户。四和五。又增加两,没问题。买再一个是修改,一个是增加增加。那这样的话怎么合并到这个拉链表,初始化拉链表里面呢,你看啊,这里面没有这两列啊,没有开始时间结束时间。哎,那你首先要做的是就是通过这张表里面过滤出来新增和变化的数据。那你回忆一下我们这个用户这个表里面是不是就是考它的新增和变化,也是用SCO导的时候导的,就是它的新增和变化。
14:07
那你就会把谁取到呢?把李小四取到。再把这个六和田七取到。因为我取这个像什么一号和三号没有意义啊,根本就没有发生变化,你原来这个张三是什么,你这个王五是什么,那就是什么,没有必要变化,我需要的是它的新增和变化的数据拿回来。找到,找到之后,这是新增和变化的数据,这是历史的拉链表里的数据,我需要把这两张表的数据进行一个整合。哎,把它两个进行一个噪音处理。到里面去。拼到这里面去啊,你先看首先原来的这里面的历史数据1231。嗯。然后新增的新增和变化的数据,新增的好说了,直接在它的四五加到后面,同时加上对应的开始时间和结束时间。
15:05
平过来,那还有这里面还有一个变化的,李小四,变化的也好弄看好了啊,变化的其实也是增加一条。对吧,这是新增的。都往这一放。唯一比较难处理的是它。也就是说你修改了之后,以前的这个数据怎么变,你需要把以前的这个结束时间修改成它。修改前一天的时间说一我们需要掌握的就这块。啊来处理它,怎么来处理它。如果在MYSQL里面很简单了,那我直接直接修改一下就行了,但是在have里面你没办法去修改某一个字段。哎,没办法修改某一字段,就跟我们,呃,刚才分析那个订单,订单四时表和领取购物券实时表一样,你没办法改变某一条信息,那我们怎么做呢?我改变不了一条信息,我就改变你整个所有分区。
16:06
那同样道理,这里面我改变不了你这一个字段,我干嘛呢?我改变你全表啊,我把你全表进行一个不就完了吗?道理是一样的哈,道理是一样的。行,那再稍微回顾一下这块怎么处理啊,也就是说这块首先获取到新增和变化的数据。然后跟历史的表进行一个噪音处理。噪音处理的时候分两步,第一步,新增和变化的数据仍然只是在它末尾,加上开始时间和结束时间,这事就OK了。啊,就OK了,那如何来处理这块呢?你需要用它去left噪音,它记住是left噪音,后面我再说为什么是left。因为你要保证这里的数据一定要有。你看你现在如果跟他去的话,正常能够匹配上只有二。那你一就没了。
17:01
啊,一和三我们是要保留的啊,所以说这里面要选择left噪音,去left噪音它噪音你看用它去left噪音它的时候能匹配到谁呢?就能够把这个二。匹配。你看他俩一着人就二跟它不就关联上了吗?关联上只要能关联上之后,那我想修改这字段就容易了。哎,我修改之后呢,先把它放到一张临时表里面,然后临时表再把这个这张整表一覆盖。哎,这就是这个处理的一个思路哈,行,那我们再往下看。下面呢是制作拉链表的一个过程。打开。知识化拉链表过程,这里面呢,是用户当日全部数据和买施工中每天变化的数据拼在一起,形成一个新的临时拉链,用临时拉链表覆盖旧的拉链表啊,不用看这个,再看这个。
18:04
啊,用户当日的全部数据,你说你数据库里面有什么数据,直接头一天的时候导入到这个用户拉列表里面,这只是建出仓的时候只允许导一次啊,只允许导一次初始嘛,初始的状态只导一次,好之后呢,第二天呢,这里面就会有新的用户发生变化。啊,那就MYQ里面发生变化,那我就把里面新增和变化的数据都给倒过来。还记得怎么导的吗?新增的时间是create是今天,修改的时间呢是op time是今天,那就新增和变化的数据都倒过来了,这是新的数据,这是历史的老的数据。那好。我取出老的数据和新的数据,进行一个噪音操作处理。哎,刚才说了新的数据呢,是在它后面加上开始时间和结束时间。然后呢,这个老的数据修改怎么抄修改呢?用它历史的数据去life噪音。
19:05
Life的赵云。如果招人的上,就说明需要修改。那需要修改的话,那你就把对应的字段给它修改上,修改上之后存到一张临时表里面。啊,临时表,然后干什么呢?把临时表里的数据override回来,你再写回到你原来的历史表里面,那这里面拿到的就是最新的数据。稍微捋一下,当然这块呢,你是没有不建这个临时表也行,你直接用这个数据和这个数据卡放在中间一个缓存里面直接过来。其实我们这个,呃,订单事时表和领用券实时表,就是采用这种中间临时的形式啊,比如说没有额外建这张表。啊,没有,你建额外这张表的话,相对来说可靠性会好一些,为什么可靠性好一些呢?你万一你这个往这里面override过程当中发生错误了。
20:00
那你家得回滚是吧,啊回滚那现在呢,你这里面哎,往这里面写成功之后用它去回滚,相对来说会更安全一些啊啊。那过来,那这个呢,就会产生是相当于是第二天之后的最新的拉链表,那再来那第三天的时候呢,MYSQL里面又有新增和变化的数据过来。又有新的变化数据,那好,那我就把新增和变化的数据跟你历史的拉链表,哎,再进行一个合并,产生新的,以此类推,再往下走啊,再往下覆盖啊,这样的一个不断的一个迭代的过程。啊,就形成了对应的一个拉链的一个状态哈。好,嗯。这是订单拉链表的一个理论上的一个分析。
我来说两句