00:00
呃,来吧,各位同学,那咱们接下来呢,要整的就是咱最后一张维度表了,叫做用户维度表啊OK,为什么要给它放在最后一个地方呢?是因为它跟之前的这些表确实不太一样,那这张表我们给他做的是一个什么?是一个拉链表,你看它的这个表名后边是不是有一个Z呀,对吧,是一个拉链表,OK,那大家还记不记得这个拉链表,那它的相关的知识点呀,就是什么是拉链表,拉链表的意义是什么,拉链表怎么用,这些大家还能想起来不能不能咱也去复习一下吧啊OK,简单的回顾一下,因为这个比较比较重要,咱们多重复一位也也没啥毛病啊。好,那接下来我们找到之前的这个数据仓库的键盘理论应该在哪?应该在哪一节?维度变化这一节吧,对不对啊,OK,应该在维度变化这一节啊,维度变化这一节呢,我们一共讲了两种类型的表,一种是全量快照,一种是拉链,全量快照呢,咱们已经讲了好几个了,对吧?我们就不再多说了,我们重点看拉链,首先我们先来回顾一下什么是拉链表,然后呢,再去回顾一下就是拉链的意义是什么,然后再去回顾一下就是拉链表怎么用对不对,然后之后呢,我们就可以去看一下拉链表最终到底怎么制作了,咱们现在要要讲的重点这个数据怎么制作呀,对吧?好,那现在咱们先回忆一下啊,来点开这个PPT看一看什么是拉链表,其实不点开也没事了啊,咱们就直接看一下这个图就行了,这就是一个典型拉链表,对吧?咱们需要熟悉拉链表的结构,你得知道每行是什么,每列是什么,对吧?每行指代的应该是什么呀?
01:27
是什么来着,是一个维度对象的一个状态吧,一行对吧?OK,这个这个状态呢,可能是历史的状态,也可能是最新的状态,对吧?OK,最新的状态它的标志是什么来着?结束日期得等于极大值吧,对吧?这样是不是就是最新状态对吧?这个一定要回忆起来啊好,那接下来呢,咱们就继续往下进行,呃,那玩意之后行咱们清楚了,接下来我们明确一下它的列啊列,其实里边有一部分字段,就是一些常规的维度属性对吧?常规的维度这个没什么特殊的,那特殊在哪呢?在后边这俩,诶,这个日期上边,开始日期,结束日期,咱得知道这个开始和结束针对的是谁,针对的是谁,针对的是这一个状态对吧?一个状态它的开始和结束日期,这里一定要搞清楚好了,那这就是拉链表的一个基本的结构啊,咱需要搞清楚好,那拉链表的结构搞清楚了,我们接下来再明确一下拉链者的意义是什么,拉意是什么来着。
02:20
这摆明了对吧?拉链表的意义就在于能够更加高效的保存维度信息的历史状态,对吧?它的高效体现在什么地方?用一句话说明一下,高效体现在什么地方?体现在它不会重复的去存储那些不变的状态,这是它它高效所体现的这个地方,对吧?OK,那接下来咱们看一看它到底是怎样去高效的存储的,来,我们打开这个下边一个PPT,这里边呢,我们做了一个简单的对比啊呃,这个这个这个这个我开一个PPT的软件吧,OK,打开了啊好,那往下走,那咱这做一个简单对比,左边呢,是用每日全量表去保存维度的历史状态,而这个右边呢,是用拉链表保存维度的历史状态,对吧?OK,好,那你要用每日全量表,就是不管我这个状态变没变,他说每天都要存一份对不对,比如说这个位置。
03:07
一号用户他从这一天到这一天100多天这个状态从没变过,但是你要做每日全量是不是得保存100多份,对不对,是这样的啊好,那我要用拉链表呢,对吧,你一号到5月11号没变,我是不是就只保留一条数据就够了,没没问题吧,我用这个开始和结束日期来表示,OK,在这段时间内都是这一个状态,OK,那这是不是就是拉链表,它存储高效的一个,呃,经典的案例啊,对吧,这块应该是能够看出来的,好了啊,然后在这块还要稍微的注意一下。注意什么呢?就是拉链表,它不是说在所有的场景下,对吧,它都能如此高效的去保存维度的历史状态,它只要在什么情况下会如此高效呢?什么情况下,什么情况下,就是说当我们诶业务系统当中与这个表相对应的那张表,对吧,它每天变化的比例不是那么高的时候,对吧?是不是拉链表才诶更加高效啊对吧?诶是这样的,OK,那这个道理其实很简单,对吧?假如说我这张表它每天变化的比例非常的高,对吧?比如说我每天90%以上的数据都会变,那这种情况下,你要是做每日全量表,跟你做拉链表,你每存保存的数据其实差不多吧,对不对?那所以说这种情况下拉链表它的意义就不是那么的,呃,这个呃明显了对吧,它的优点就不是那么的突出了,诶这一点要稍微的注意一下啊,好了,那这就是拉链表它的意义对吧,也就是他适合在用在什么上面呢?用在那种所谓的缓慢变化为上面对不对,在缓变变缓慢变化为里边那。
04:37
哎,我的这个呃,拉链表它是能够呃极大的减少这个存储空间的,诶这一点要注意,当然减少是跟谁相比的啊,是跟这个每日全量相比的,对吧?诶这个搞清楚就行了,好了,这就是拉链表啊,它的一个意义,咱们也要简单的回顾一下,好最后最后咱们再来回忆一下怎么用拉链表,怎么用拉链表大家还记得。我们使用拉链表的场景是什么?拉力表本身也是维度表,对吧?既然是维度表,我们用到是怎么用,是不是用事实表转唤维度表啊,对不对?那事实表转唤维度表的时候,是不是有一个原则,有一个要求,什么要求来着,就是哪一天发生的事实就要去召唤维度在哪一天的状态吧,对不对?OK,那我们这个事实呢?啊,大致可以分为两种情况,一种情况呢,就是最新的一天的事实,还有一种情况呢,就是历史上某一天的事实,无非就是这两种情况,对吧?那所以说你要是用最新的事实对不对?去照我这个维度状态的时候,你得照什么?得照我们一份全量最新的维度状态吧,没问题吧?好,那怎样从拉链表里边去拿一份全量最新的维度状态,怎样去拿?
05:40
谁要去哪?想想是不是就是结束日期等于极大值就完事了,对吧?结束日期等于极大值我就能拿到,是每一个人的最新状态,对不对,这个其实很简单啊好,那我还有一点就是啥,就是我怎样呃获取我这个呃,历史上某一天的这个历史状态啊,从哪两表里边怎么获取。
06:01
是不是有一个公式啊,对吧,这个公式大家还记不记得是什么来着,我只要保证开始日期是不是小于等于你要获取的那个日期对不对,并且结束日期它得大于等于你要获取那个日期是不是就完事了,对吧?为啥只要你想啊,只要你的这个状态对不对,那它的开始日期对不对,还有结束日期满足你这个条件对不对,那就说明什么呀。说明你想要的那个日期是位于这个状态的生命周期之内的,对吧?哎,那这样一来,这个状态不就是你想要的那个状态吗?啊,其实就这么个逻辑啊,是这样的啊,OK,也就是这个公式呢,咱们大家得给它记住,稍微的有点绕这公式啊,但是你仔细理解应该是,呃,理解了之后就能记住了啊,就是这样的啊OK,那大家自己把这个拉链表的这个使用的相关知识点也要回忆起来好了,那截止到现在呢,我们这个拉链表的呃基本概念,哎,包括它是什么,它的意义是什么,还有怎么用,咱就回忆起来了,那接下来呢,我们要做的工作就是啥啊,是不是咱们就得去设计,去制作一张真正的答练表,对吧?好,那咱们接下来呢,就来分析分析这个真正的答案表,我们到底怎么去做啊?来,我把这个视频先停一下。
07:10
啊,来吧各位,那现在呢,我们来,呃,就是这个实际的去制作一下这个拉链表,对吧?那咱这个用户维度咱做的就是拉链表,好了,那接下来首先我们要的工作是什么呢?是不是还是得先设计这张表的表结构啊对吧?OK,好,那怎么去设计它的表结构呢?设计表结构无非就是干啥呢?是不是确定它的行还有列呀,对吧?OK啊好,那拉链表呃,它它的数据它跟那个什么日期维度表不一样啊,我们拉链表呢,呃,虽然跟我们前面所讲的那个其他的维度表呃不太一样,其他维表我们都叫什么,是不是都叫那个什么?呃,每日全量快照表啊对吧?那这个叫做拉链表,虽然不太一样,但是他们也有共同点,共点的是什么呢?就是他们的数据呢,在这儿是不是也是来自于业务系统呀,对吧,他们都是来自于业务系统,是这样的啊,那既然都是来自于业务系统,所以说我们这个用户维度表的表结构的设计灵感,那也应该来自于哪儿呢?是不是也应该是来自于我们的业务系统啊,对吧?那所以说我们在设计这张表的时候呢,也是可以遵循咱们前面的那些维度。
08:10
表的建表理论的,呃,就首先我们也是需要先干啥呢,是不是也是需要先去找它的主维表相关为表啊,对吧?好,那现在咱们就去找一下那业务性能当中与用户相关的主页表,相关表有啥呀。有啥呀?其实就这一张呗,对吧,是不是就是ods user INF IC这张表就可以作为我们这个,呃,这个用户维度表的这个设计的灵感呀,对吧?哎,主要就是它好了,那现在呢,我们就来看一看,就是这张表的表结构大家熟悉不熟悉啊,这张表应该比较简单吧啊,当然可能你看到这张表之后,可能看到这个表结构有点有点诧异啊,但是这个是因为什么啊,是因为咱们这张表它采用的是什么同步。是增量同步是这样的啊,这一点大家稍微都注意一下,OK,那增量同步呢?呃,咱们是不是区要需要区分一个首日的全量,还有一个每日的增量,对吧?那咱现在看的这个数据实际上是怎么过来的,实际上是通过那个首日的全量同步过来的吧,对不对,因为它的类型你看现在是不是就是bootrap in类型的,对吧?这个大家应该要要搞清楚完之后我问一下大家啊,就是这张表现在我的每行数据,它对应到我们这个表里边啊,对应到哪对应到MYSO这个表里边,它是不是一行对应一行。
09:22
是不是是的啊,因为这边呢,我们是怎么是基于查询的对吧,就说白了它就是怎么做呢,就是把买思Q当中这张表一行一行的数据是不是封装到了一个一个的阶层字符串里边了,对吧?实际上我们这个数据当中的这个date字段下边存的数据跟我们这个MYQ当中,这张表当中的一行数据是一样的吧,对吧,这个给他搞清楚就行了啊OK啊好了,那咱们接下来继续往进行,那咱要熟悉表结构的话呢,咱们就不在这儿熟悉了,因为这个看起来是不太好看呀,对吧,咱们看这就行了,那这张表结构应该很熟悉吧。对不对,首先明确的是每行,每行是不是就是一个用户那列呢。字段呢,字段其实就是一些基本的用户的维度属性吧,对吧,那这个咱们就不再一个一个去看了,这表也很简单好了,那这张表的结构咱熟悉了之后,是不是就可以依据这张表的表结构去设计咱们那个用户维度表的表结构了,对不对?OK,那完了之后咱们开始设计吧,对不对,那我这个用户维度表我最终我每行指代的应该是什么呀。
10:19
美涵应该是什么?是一个用户吗?这个不太准确啊,为什么?因为用户段咱们做的是拉链表对吧?而拉链表当中每行所指的的内容咱们是有明确的规定的是吧?每行是什么来着,是一个状态对吧?所以说将来咱们这张表每行所指代的应该是一个用户的一个状态,这个要搞清楚好,那列怎么确定的列其实绝大多数字段是不是应该是来自于与之相关的这张表啊,对不对?OK,这个应该是很好理解的,然后除了这些字段,我们还得有什么,还有两个额外的字段对吧?一个是开始时间,一个是截止日,前日时间,对吧?诶,应该是这样了,那所以说这样一来的话,咱们那个维度表的行列基本上就确定了,确定之后,那接下来呢,咱们就一起来看一下最终的这个鉴表语句好了,那我现在把这个拿过来,咱们一起看一下啊,好,那首先呢,我放在这个位置来,我把这个给它注一下啊,好了,那现在呢,我们把这张表的最终的介表语句给它过一下,首先先看它的表名DMUZ,这个没什么特殊的,对吧?呃呃,这个唯一的特殊可能就是这个Z原来都是负,现在变成Z了,对吧,这个不多说。
11:22
然后往下看,那下边呢,就是咱们这张表的具体的行列分区了,先看行一行,刚才说了是一个用户的一个状态啊,OK啊,好,那完之后看具体的字段,这里边呢,字段可以大致分为两类,前面那些其实都是来自于用户这张表的那些用户属性信息,对吧?哎,这个咱就不再一个个过了啊,就是什么姓名啊,昵称啊,手机号码啊,电子邮件等等,就这东西,这个就不再多说了,往下看重点看这俩字段。这俩字段是比较关键的啊,它是不是就是刚才我们提到的这个每个状态的开始和结束日期啊,对吧?哎,这一定要搞清楚好,那现在呢,咱们这张表的行和列就都看完了,接下来咱们哎思考一个问题,什么问题呢?就是它的分区我们应该如何规划,这个拉链表是也也是一个分区表,对吧?它的分区咱们怎么规划?
12:11
这回得好好想想,你看啊,像之前我们做的那些维度表对吧,就是主要是一些每日全量快照表,他们的分区是不是很好规划呀,对吧,就一天一个每天的分区都就放当天的全量是不是就完事了,对吧?但是拉链表这个分区咱怎么规划呢?我按照什么分区对不对,然后呢,我每天的分区里我放什么数据。对吧,这个大家是不是得琢磨琢磨呀,对不对,好好想一想,它的分区咱怎么规划比较合理。怎么规划比较合理?首先你要知道分区怎么规划合理,咱们得知道啊,就是我们分区的意义是什么,分区的目的是什么。在汉表里边,我们对表进行分区有啥用啊?主要是为了干啥?分区是不是会把呃,一个表当中不同的数据放在不同的路径呢?对吧,没问题吧?OK,那你分完区之后,我们将来是不是在查询数据的时候用分区作为过滤条件,是不是这个效率会更高啊,对不对,也就是说我们分区的一个主要的目的就是便于将来的查询,是这个道理吧?那所以说我们每张表的分区规划怎么设计,你得考虑到将来这张表你怎么查它。
13:23
是是这个道理吧,对不对?OK,怎么方便查询,我这个分局我就怎么设计呗,对吧,OK,好,那现在来分析一下,你说将来这个拉链表咱们设计好之后,我怎么从里边查数据。我怎么从里边查数据。对,咱们做这啥,其实无非就是两种情况嘛,因为这本身就是一个拉链,就是一个维度表对吧?维度表咱们前面说过,你查数据的话,不就是两种场景嘛,要么就是获取一份全量最新对吧,要么就是获取它历史上的一份,这个数据是不是应该就是这样的两种场景,对不对?那所以说我是不是应该从这两种场景去考虑啊,对吧?好,那我现在再问一下大家,你说这两种场景哪个更频繁一点,是查历史还是查最新更频繁一点,其实查历查最新最更频繁一点,为什么啊?因为你想一下,咱们离线数仓,我每天是不是都要去计算对不对,那你每天计算的话,是不是都要从这张表里查一份它的最新最新数据啊,每天是不是都要查一份,每天都要查对吧,那所以说其实查最新这个是更加频繁一点的啊,是这样的啊,那所以在这儿呢,我们就重点考虑一下,怎样设计能够加快我这个最新一天的这个数据的查询就可以了,对不对,怎样设计能够满足或者能够就是加快。
14:36
我这个最新最新一天这个状态的查询怎么设计,他有没有方案。有没有想法?那实际上咱们呃,文档当中已经给出了这个明确的分区规划了,那现在我就不再卖关子了,咱们一起来看一看,最终咱这张表到底是怎么设计的啊来,我把它打开,咱们一起看一下这个我先开个PPT啊来,现在呢,咱们一起来看一下这个最终的分区规划,首先咱们先来看一看它这个分区都是怎么弄的啊呃,首先各位同学我们先看这个地方,诶,你会发现这里边呢,它有一个叫做DT等于9999-12杠三幺的这样一个极大值分区,对吧?那除此之外呢,它还有一个什么。
15:16
是不是还有一个每天一个的分区,对不对,十四十五十六十七是吧,是不是还有一个每天一个的分区啊,对吧?好了,那一共有这样的两部分,那接下来呢,我们来看一看这两部分里边它存的都是什么啊,先看这个极大值分区。极大值分区你会发现它存的是什么,是全量最新的用户信息,也就是说这个极大值分区里边,它是不是保存了一份全量最新最新呀,对吧?OK,好,那这个咱们先搞清楚,那接下来我们再看前面。前面那些分区里,他每天的分区放的是啥呀。每天的分区放的是当日过期的这个用户数据,诶这里边有一个概念叫做过期,什么叫做过期,什么叫过期。就是那个状态结束了,是不是就要过期了呀,对吧,那是有道理吧,OK,说白了所谓的过期的数据就是什么?就是这些用户的什么状态,历史状态对不对?OK,那这个所谓的这个999分区里放的啥,就是每个用户的最新状态,是不是就是这个逻辑啊,对吧?好了,那这就是咱们这张板最终的分区规划,那现在大家得琢磨琢磨啊,我为什么要这么去设计对不对,为啥要这么设计?
16:24
我为啥我在这儿要放一个这个999分区校对吧?这个其实道理很简单,是不是就是为了方便咱们将来查询啊,对吧?OK,前面咱们提到过,我们使用拉链表最频繁的一个场景就是获取它的一份全量最新,那所以说我是不是直接设计一个单独的分区,让它里边始终都存放全量最新对不对?那将来我再拿存量最新,是不是直接拿这个分区,那就完事了,对吧?诶,就不用再去便利全面啊等等,不用再做类似这样的操作了,是这样的啊,这一点咱们大家要搞清楚,所以说这个分区它存在的意义大家应该就搞清楚了,那我们再来分析分析前面这些分区为什么要存在,它们存在的意义是干什么是什么?哎,其实这个很简单,你琢磨琢磨啊,因为咱们刚才提到了这个分区,我们只能存放全量最新。
17:08
是这个道理吧,啊,那你想一想,我们买四当中的用户表,每天是不是都会发生新增或者是变化呀,对吧?好,那你想想,只要有新增,只要有变化,你就得怎么办。新增和变化的数据,这都叫什么?都叫最新状态吧,新增变化都叫最新状态对不对,那所以说新增级变化的最新状态,你最终都要放在是不是九九游分区,因为它里边始终得存放全量最新嘛,对吧?好,那有新增你放进去没问题,有变化,这时候你就得考虑一个问题了,什么问题。有变化,那意味着什么?意味着是不是这个分区里边有一部分数据已经不是最新状态了,它变了对吧?OK,变了之后我还能在这个分区里放着吗?不能了,因为咱们有规定,我这儿只能放全量最新,对不对?既然你已经不是最新了,那你就不能在里边待着了,你就得出去对吧?OK,那玩意儿你出去之后,咱们能直接给它删了吗?你不能删,为啥?因为咱们有规定,拉链表咱们得保存历史状态吧,对不对?你删了那就没历史状态了,那所以这肯定那既不能删还得拿出去,那你是不得找地方给他放一下啊对吧?你放哪儿呢?是不是就放在咱们这个当天的这个过期分区就完事了,对吧?诶,你是哪一天过期的,那我就给你放在哪一天啊,这个所谓的哪一天过期,其实指的是什么呀?说白了指的就是你的结束日期是哪一天,你是不是就是哪一天过期的。
18:26
没,每个状态是不是都有一个自己的开始和结束日期啊,对吧?哎,你的结束日期哪一天,你这个状态就是哪天过期,哪天过期我就给你放在哪天的分区里,那就完事了,哎,那这时间上呢,就是咱们这个用户拉链表的一个分区规划,哎,它还是有点特殊的,对吧?哎,是需要好好思考思考的,好了,各位同学,那截止到现在呢,这个拉链表的分区规划咱们也就说完了,OK,那到目前呢,我们拉链表的行还有列,还有分区,咱基本上就明确下来了,好,明确下来之后,咱接下来就需要考虑一下它的数据装载咱们怎么做了啊来视频我停一下。
我来说两句