00:00
好,那接下来我们看最后一张维度表啊,叫做用户维度表啊,那大家注意观察,它的后边有一个标注啊,叫做拉链表对吧?那拉链表的概念呢,大家可能不是那么的熟悉啊,那所以说我们现在呢,先不急着去看,哎,用户维度表这一张表啊,那我们先把拉链表的概念搞清楚啊,好,首先我们先看一下什么是拉链表,来,我们往下看啊,打开这个PPT。那这儿呢,有一些文字描述,我们暂时先不看啊,咱们直接看下边的这个图啊,这个图所描绘的就是一个典型的拉链表啊,那现在我们来观察一下这张表啊,那当然我们观察这张表的时候呢,也得去观察它的行以及它的列对吧?那我们现在先看它的列,也就是字段啊,那字段呢,我们先看这一部分,这一部分字段其实比较简单,就是一些普通的用户信息对吧?包括用户的ID,用户的姓名,用户的手机号码等等等等啊,那再往后这儿还有两个字段。啊,一个叫做开始日期,一个叫做结束日期,诶这个开始和结束指的是什么的开始和结束日期啊。
01:05
对吧,这个我们好像还找不到答案,那所以说暂时咱们先放一放啊,我们先去看一下它的行啊,我们来观察一下它的每行数据指来的是什么。啊,仔细观察啊,它的每行数据指代的不是一个用户对吧。啊,显然这三行数据是不是都是同一个用户的呀,对吧?啊,那那它的每行数据到底指的是什么呢?那实际上它的每行数据指代的是一个用户的一个状态。啊,那这个开始和结束日期,其实指的就是这个用户的状态的开始和结束日期。啊OK,那咱们现在怎么去理解这张表呢?其实很简单,大家来看一下啊,第一行数据我们怎么去理解啊,那第一行数据呢,我们的理解就是那从2019年1月1号到2019年1月1号,那用户一啊,也就是一号用户他的姓名啊是张三,那手机号码呢,是136巴拉巴拉。
02:04
啊OK,那第二行数据咱们怎么理解呢?啊,那也就是从2019年1月2号开始,到2019年1月9号结束,那一号用户他的姓名都是张三,那他的手机号呢,诶都是137啊点点点点点。啊,OK,那我们再往下走,那从19年1月12开始到9999杠九九杠九九,那其实有什么意思,哎,也就是至今啊,那他的状态都是什么呀?哎,姓名是张三,那手机号呢,是147啊好,那这就是拉链表的表结构啊好,那看完表结构之后呢,我们再继续往下进行啊,那看一下我们下边要讨论的问题是什么啊,下边的问题是为什么要做拉链表?啊,或者说拉链表的意义是什么啊,对吧,那其实我可以先告诉大家,那拉链表的意义呢,其实就是它能够更加高效的去存储历史状态。啊,什么叫更加高效的去存储历史状态呢?这句话怎么理解呢?来,我们看一个例子啊,我们打开这个PPT。
03:05
好,我们还是看下边的图就可以了啊,那图当中画的是什么啊?左边是一个每日全量表,右边呢是一个拉链表啊,那这俩表干什么用的呢?来给大家说一下啊,假如我现在有一个场景啊,我让大家干啥呢?让大家去保留每一个用户的历史状态。啊,那大家最容易想到的一种方案,那就是啥呀。那是不是做一个每日全量表啊,什么叫每日全量?那就是每天对用户表做一个全量的快照,对吧?啊,每天一个全量快照,每天一个全量快照啊,那这样一来我们能不能把历史状态保存下来呢?那肯定能啊,对吧?啊,这是肯定可以的啊,但是这种每日全量表啊,它是有弊端的。啊,有什么弊端的,那你想一想啊,假如有一个呃用户,那他的信息啊,啊,一段时间之内从来都没有发生过变化啊,那OK,这时候会出现什么问题啊,那这个重复的信息,那你是不是会保存很多份啊,因为你做的是每日全量快照,对吧?不管他的信息有没有发生变化,那我是不是都得保存下来,这就是每日全量的特点。
04:06
啊,那显然这个存储效率是不是有点低呀,对吧,因为我们存储了大量的重复数据。啊,那咱们拉链表它能不能去解决这个问题呢?那当然可以了,其实拉链表主要就是为了解决这个问题啊好,那现在我们看一下拉链表它是如何解决哎,咱们这个存储效率低的问题的啊OK,我们看一个具体的例子啊,那假如说那一号用户啊,那他从2019年1月1号到2019年5月11号啊,这段时间呢,他的状态都没有发生过变化啊,那如果说我们用每日全量表去保存它的信息,那这这份这个不变的信息,咱是不是会保存很多份啊,对吧?啊,那如果换做拉链表呢。哎,你注注意观察一下啊,是不是咱们只需要一条数据就搞定了呀,对吧?啊,那我们怎么去解读这条数据呢?看一下,那从2019年1月1日开始,到2019年5月11号结束啊,那在这段时间内,那一号用户的状态是不是都是这个呀。
05:07
啊OK,那这是不是就对比就非常明显了呀,对吧,那所以说我们拉链表它的主要的意义就是以更加高效的方式去保存历史状态。OK,那接下来我们看下一个问题啊,下一个问题呢是如何使用拉链表啊,所谓的如何使用拉链表呢?啊,就是如何从拉链表当中获取我们想要的数据啊,那使用拉链表的时候呢,基本上就是这样的两个场景啊,那第一个场景啊,就是获取一份全量最新的数据,那另一个场景呢,就是获取一份全量的历史数据。啊OK,那现在这两种情况我们分别讨论一下啊,先看第一种情况啊,那第一种情况呢,就是获取一份全量最新的数据啊,那怎么获取啊啊其实很简单啊,一个过滤条件就搞定了啊这个过滤条件应该是什么呢?哎,结束日期等于9999杠九九杠九九。
06:00
啊,那大家想啊,那end date,也就是结束日期等于9999杠九九杠九九,那说明什么?说明这个状态是不是最新状态,没错吧,那每个人是不是都有且只有一个最新状态啊,那所以说我们结束日期等于9999,就能够拿到一份全量的最新数据啊,这个非常简单啊,那接下来我们讨论第二一个情况啊,第二一个情况是什么啊,是如何获取一份全量的历史数据,那这个具体怎么获取呢?来,我们看下边的PPT啊,OK,我们打开这个PPT一起看一下啊。好,那假定啊,我现在想获取拉链表当中啊某个日期的啊,一份全量的数据,那当然这个日期呢,指的是一个历史日期啊,那我们应该如何获取呢?其实也很简单啊,呃,也是通过一个过滤条件就能搞定啊,那我们来看一下这个过滤条件怎么写。好,那我们只需要加上一个开始日期小于等于诶,你要获取那个日期,那并且呢,结束日期大于等于你要获取的那个日期,那这样一来我们就能够拿到这个日期的全量的历史数据了。
07:14
啊,OK,那接下来我们举一个例子啊,好,大家看,那这就是一张拉链表,那我们注意观察一下这个拉链表啊,拉链表呢,一共有四个用户对吧?那其中二号用户呢,是有两个状态的,那从19年1月1号到19年1月2号,那他叫李四,那从1月3号至今是不是改为李小四了呀?啊,对吧?那这是大家要注意的啊OK,那接下来我们往下看啊,假如我现在想获取2019年1月1号的历史切片,这个所谓的历史切片呢,指的就是这一天的全量的用户信息。啊,OK,你看我们这儿怎么去写的过滤条件啊,再来星from这张表,然后where是不是就是开始日期小于等于你要获取的日期,是不是就是1月1号啊对吧?那并且结束日期大于等于你要获取的日期,那也就是19年1月1号。
08:02
啊,没错吧,啊,那这样一来的话呢,我们就能得到这样的一部分数据啊,那我们来看一看啊,这部分数据是不是我们想要想要的1月1号的全量的历史数据,咱们来看一下啊,那首先我们先看第一条数据,第一条数据呢,是一号用户对吧?那OK,我们去看一下一号用户啊,它的状态是什么样的啊来看一下。那1月1号一号用户呢,他只有一个状态对吧?那从19年1月1号开始,然后至今是不是都是这个状态啊,那我们要想获取他1月1号的状态,那OK,那是不是就是张三,这个没有问题对吧?那所以说我们拿到的这条数据是正确的,OK,那接下来我们再看第二条数据,二号用户,二号用户呢,我们获取到的状态是李四,对吧?那看一下李四是不是我们想要获取的状态,那二号用户呢,一共有两个状态对吧?那一一月一号到1月2号,那是李四,那从1月3号至今就是李小四了,那我们要的是1月1号的状态,那所以说拿到李四应该是没有问题的。
09:02
啊好,那接下来继续往下进行,我们看拿到的这个三号用户,那三号用户呢,他的状态,呃,是不是只有一个对吧,而且是从1月1号开始至今都是哎王五,那所以说我们拿到王五这个状态也是没有问题的啊,然后再注意观察一下啊,我们结果当中是不包含这个四号用户的。对吧,那为什么没有包含四号用户呢?那因为你注意观察,四号用户只有一个状态,那这个状态的开始时间呢,是1月2号,那所以说是不是1月1号的时候,我们的拉链表当中,或者我们的用户表当中,是不是还没有出现四号用户啊,对吧?那所以说四号用户根本就不应该出现在我们最终的结果当中,那所以说哎,此处的处理也是正确的,好,OK,那这就验证了,哎,我们这个过滤条件的诶准确性。OK,那这就是从拉链表当中获取历史数据的方法啊好,那现在我们总结一下啊,那使用拉链表我们一共就两种场景,一种场景呢,就是获取一份全量最新的数据,那另一个场景就是获取一份全量历史数据,对吧?那如何获取全量最新呢?啊,一个物理条件结束日期等于9999杠九九杠九九就搞定了,那如何获取一份全量的历史数据呢?
10:18
来通过这个过滤条件啊,那就是开始日期小于等于某个日期,并且结束日期大于等于某个日期啊,那这就是我们使用拉链表的这两种途径,OK,我们继续往下进行啊好,我们看下一个问题啊,下一个问题呢是拉链表的形成过程啊好,我们打开PPT看一下它的形成过程啊好,那现在假定啊,我们数据仓库运行的第一天是2019年1月1号。啊,那通常情况下,呃,我们的业务系统当中是存在历史数据的,对吧?啊,那假定那这一天我们业务系统当中的用户表,哎,它的状态就是这样的,里边呢,已经有若干历史用户了啊OK,那所以说我们第一天的时候需要做什么事儿呢?诶,我们需要做一个拉链表的初始化啊,那也就是说我们在第一天的时候需要一次性的把业务系统当中的用户表的全部数据来装载到拉链表当中。
11:16
啊,当然我们去装载的时候呢,需要在原有的这个字段的基础之上再加上两个字段,哪两个呢?诶就是开始时间和结束时间啊,那注意一下啊,这个开始时间和结束时间,那咱们怎么去确定呢?那其实结束时间好确定对吧,肯定都是999,为什么呀?因为在我们的业务系统的数据库当中保存的是不是永远都是最新状态啊,对吧?那所以说我们同过来数据都是最新状态,那结束日期是不是都是9999啊,那其实主要是这个开始日期哎,咱们如何确定。那实际上大家都知道啊,这个开始日期实际上指的是这个状态的开始日期,对吧?啊,但是我们业务系统当中可能并没有去保留我们这个状态的开始日期,那所以说在这儿呃,很多情况下,这个开始日期我们是确定不了的,那确定不了的话呢,在这我们就给他一个初始值啊,那一般情况下呢,就以我们这个同步数据的日期作为它的,诶开始日期,那在咱这儿呢,也就是2019年1月1号。
12:17
啊,OK,这就是拉链表它的一个初始化的操作,好,那随着时间的推移啊,我们来到了第二天,第二天呢,也就是2019年1月2号,对吧?啊,大家注意观察我们的业务系统当中的用户表发生了一定的变化啊,那首先注意观察二号用户他的姓名是不是被修改了呀,对吧?那其次呢,我们又新增了两个用户,那也就是说我们这张表既有新增又有变化,对不对?那这时候我们需要怎么做呢?OK,我们需要获取到诶,这个用户表当中的新增及变化的数据。啊,那获取到之后应该怎么办呢?获取到之后我们应该将新增及变化的数据与我们昨天的拉链表做一个合并,啊,那大家先来思考一下啊,你说我们合并的时候需要做哪些工作?
13:08
啊,其实主要是两个工作啊,拉链工作,首先第一个我们需要将啊今天新增以及变化的状态啊插入到拉链表当中,不管它是新增还是变化,我们都要插入到拉链表当中。啊,这个大家一定要注意啊,那当然插入进来的时候呢,我们仍然需要考虑这个开始日期和结束日期的问题,对吧?那结束日期肯定也都是9999,没错吧,因为不管是新增还是变化,它都它是不是都是至今的最新状态呀,对吧?那所以说结束日期999没有问题,那开始日期呢。那很简单,那是不是就是1月2号对吧?啊,因为是不是1月2号开始,那二号用户才叫李小四了,对吧,那五四号和五用号,那才开始叫赵六和田七,没错吧,那所以说那那他们的开始日期,那就是1月2号结束日期就是999,这是我们要做的第一项工作啊,那我们其实还有一个工作要做,那另一个工作应该是啥?大家思考一下。
14:05
啊,其实很简单啊,大家注意观察一下,由于二号用户的状态已经发生了变化,对吧?啊,那他李四的那个状态是不是就已经不是最新状态了。没错吧,那所以说我们需要将修改的用户的,呃,上一个状态的结束日期啊,由9999改为前一天的日期,那注意啊,是改成前一天的日期,那我们今天是1月2号,没错吧,那也就是说那李四这个状态的结束日期应该是1月1号。啊,这个一定要注意,那一般情况下呢,我们同一个用户的两个状态的开始和结束日期呢,是不会有交集的啊,这个一定要注意一下啊OK,好,那经过我们的这两步处理之后,我们得到的最终的拉链表就是这个。大家来看一下啊,那是不是跟我们刚才所说的是一样的啊,那首先那二号用户的最新状态,还有四号和五号用户的最新状态,是不是都插入到拉链表当中了,OK,大家来看一下这个还有这个。
15:05
没问题对吧,那除此之外呢,那二号用户的李四这个状态的结束日期是不是已经由原来的9999改为了2019年1月1号啊,啊,对吧,那这就是拉链表的形成过程。
我来说两句