00:00
呃,来吧各位同学,那下边呢,我们要看的一张表呢,叫做交易日购物车,然后呢,周期快照时表,OK,那首先需要明确的一点是,它是一个周期快照时表,那大家还记不记得个周期快照时表,那它是什么样的表?完了之后呢,这个东西有啥用?还记得吗?什么叫做周期快照表来着?其实所谓的周期快照表它是干什么用的?很简单,就是去做是不是定期的快照啊,对吧?啊,就是定期的打快照对不对,那总之呢,在数仓里边,它最终表现出来就是一个什么样的类型表,是就是一个每日全量的一个表啊对不对,OK,这就是周期快照表,那它的一个这个形态就长这样,好,那接下来我们再回忆一下周期快照表它有什么用啊,我们用它干啥呀?还记得用它干啥来着。啊,是不是用它去解决一些所谓的什么库存呀,诶或者说什么呃或或者什么账户余额呀等等,是不是解决这样的一些存量型指标啊,诶是这样的,OK,好,大家还记不记得为什么用这种表去解决存量指标啊,为什么呀?我用事物实表去解决量型指标怎么了?我为什么要用它去解决存电性指标,还记得为啥吗?
01:12
这个给大家简单的回忆一下吧,这个因为也算是一个比较重要的知识点啊,所以咱们现在呢,先简单的回顾一下周期快照时表的相关理论啊,OK,我们回到之前的数据仓库的监本理论,来找到我们那个相关的位置啊,在哪呢?应该是应该是在这个位置,对吧?那周期快照时表呢,它其实主要就是用来解决事物事实表的一个不足之处的,对吧?哪个不足数就是所谓的存量性指标啥意思?也就是说我们刚刚提到的什么库存呀,余额呀,这些指标,我们要是用事物时表去做,它的效率是不是比较低啊,对吧?那所以说我们才会用到周期快照表,好,它为什么低来着,我们之前讲过一个案例,对吧?来咱们回忆一下这个案例啊,我们是以什么为例呢?以电商当中的虚拟货币为例去解释的,呃,这个虚拟货币就是说白了就是什么京豆啊或淘金币那些东西,对吧?来分析分析与这个呃虚拟货币相关的业务过程,大家说会有什么?
02:07
应务过程对吧?就是跟它相关的这个原子操作会有什么呀?无非就是俩呗,对吧,一个是什么是获取货币,一个是使用货币,那如果说我们要为其创建这个事物市值表的话,那我们应该会建两张,对不对?一张呢是诶获取货币的市值表,一张呢是使用货币的市值表,两张表当中是不是各自存储了什么东西,各自存储的是不是与之对应的原子操作呀,对吧?那获取这张里边放的就是一个一个的获取记录,对吧?张三获取了两个,李四获取了五个,对不对?那另一个呢,存放的是就是所有的使用记录啊,对吧?好,那假如说两张表已经放在这儿了,对不对?那接下来呢,我们看看一个需求,什么需求呢?就是这个需求,他让我们去统计一下截至当日的每个用户的虚拟货币余额,对不对,那我们这个指标要用上述这两张表算,我们应该怎么算呀?按照我们之前的规划,我们需要怎么做来着,是不是需要先把第一张表这个获取货币的表是不是全表的数据拿出来,然后呢,按照用户去做一个分组聚合对不对,我们就能得到每。
03:07
个人历史至今一共获得了多少货币对不对?再按照同样的方式呢,来拿另一张表的数据去算一个什么呀?算一个从历史至今每个用户是不是一共使用了多少,对吧?之后呢,再用这两个表的结果进行一个join操作,对吧?用获得的减去使用的,那我们就能得到每个用户的余额了,对吧?是这样的,那这个指标虽然能算出来,但是呢,这种计算方式它的效率极其低下,对吧?我们需要拿到两张事物时表的全表数据才能得到结果,这个显然是不太合适的,对不对?那完了之后我们这怎样去解决这个问题,在这当实是诶我们说就是对于这样所谓的什么虚拟货币余额等等等类似这样的指标,一般情况下呢,在我们的业务系统当中都会有啥,都会有一张表存储的这个最新的结果,对吧,啥意思,你就比如说以京东当了那个京豆为例,对吧,你打开自己手机,是不是每个人都能看到自己当前有有多少个余额呀,对吧,你之所以能看到,那肯定是因为什么呢?是因为他电商系统的后台,它是不。
04:07
不存储了这样的一个余额呀,对吧?那既然它存了,那我们就没必要再一点点去算了,所以在这儿我们解决问题的思路就是干啥呢?就是我们定期的把业务系统当中是不是与这个指标相关的表往数仓里边去做一次全量同步就行了,对吧?定期做全量同步对不对?那这样一来我们再想拿到余额,直接拿结果就完事了,就不用再去计算了,诶这一点大家应该能想明白,这就是所谓的周期快照时时表的意义,诶咱给得回忆起来好了,接下来我们继续往下进行,再回到我们这张表,那前面就提到过,就是这种所谓的周期快照表呢,我们在设计的时候呢,其实完全是,呃,基于谁的,基于需求的,对吧,我是不是得有类似的需求,我们才会去建就是这种所谓的周期快照表,对吧?OK,那咱这儿这个周期快照表是服务于咱下边的哪个需求的呢?来我给大家去看一下啊,来这边我们来到对比一下,咱们所有的需求都在ADS啊,那实际上他服务的需求就是这个。
05:03
哎,大家来看一下这个需求是什么啊,这个需求呢,让我们统计的是各分类商品购物车存量TOP10啊,那其实这个看标题应该能看出来,这是一个典型的什么类型的问题啊,分组top n对吧,咱们现在不不用管这个分组top n怎么算啊,咱不用不用去管这个怎么算,咱们现在重点不是它,咱重点是什么呢?是这个东西是购物车存量对不对,那什么叫做商品的购物车存量。什么叫商品的购物车存量?存量商品购物车存量,这个其实很简单,给大家解释一下这个咱们这儿的这个定义啊,所谓的商品的购物车存量呢?诶,我这儿有以一个商品为例,比如说咱们以A商品为例,大家想一想,你说A商品是不是可能会位于很多用户的购物车当中,对不对,张三里边有它,李四里边可能也有他,对不对?那我们把每一个用户他的购物车当中这个A商品的数量求个和,诶,OK,那得到的结果就是A商品的所谓的购物车存量啊,是这样的啊,OK,这就是购物车存量这个概念,好,那你想一想,你要想把每个分类当中的对不对,购物车存量排行前十的商品给他找出来,你首先得先求出来什么呀?
06:17
你得先求出来每个商品的购物车存量都是多少啊,对不对,你知道这个商品是10万件,那个商品20万件,这个商品的30万件,你得知道每个商品的购物车存量都是多少之后,那咱是不是才能去,诶给他去排名,然后取前十啊,对吧?诶这1.1定要搞清楚,所以说那我们要想算这个指标,我们就得知道每个商品的购物车存量,OK,那你想一想商品的购物车存量我们可以怎么做呀?商品的购物车存量咱们可以怎么做呀?啊,可以怎么做呀?啊,我们用事物实时表里的数据能不能做,咱们事物实时表当中有没有与购物车相关的这个表有咱们刚才有一个什么,有一个加购表对不对?加购表当中咱们存储的是什么,是一个一个的加购操作,我们会记录是谁在什么时候把什么商品是不是加到了购物车里,加了几件呀,对吧?我们用这张表能不能得到这个所谓的商品购物车存量能得到,能不能得到?
07:14
得不到为为啥得不到,你只能得到一个什么结果,你只能得到就是OK,我这个每个人他一共加这个商品加了多少件,对不对,或者说我能得到这个商品,他一共被人加了多少件,但是跟这个购物车存量是一个概念吗?不是对不对,为啥?因为你还得考虑到一个减的一个操作,对不对,我们这儿有减购物车的实时表吗?咱没有,咱没见啊,咱没见,那所以在这儿呢,以我们目前的这个表来说的这个指标咱们没法算的,OK,那我要想算它,那我怎么算呢?就是即便OK,我为了算它,我去建一个简构的表对不对,那你把这个表建出来之后,那我们用这两张表去算这个这个这个它高效吗?它也不高效对不对,那就在这了,我们不用事物指表去算啊,那怎么算呢?这其实是不是就是一个典型的够这个这个存量型指标啊,对吧?存量型指标我是不是得考虑使用周期快照表去解决,对不对,那我对谁进行周期快照了?
08:07
周期快照是不是通常是对业务系统当中的某张表做周期的快照,对吧?那对谁做周期快照能解决这个问题呢?其实很简单,那是不是就是以我们呃,这个商品当中的这个car info来作为咱们这个什么就行了,这个周期快照的目标就可以了,对吧?OK,那咱们去找一下这个car林缝啊,来看一看这张表的数据,它是什么样的一个结构,这张表咱们已经看到了很多次了,对吧?但现在已经非常熟悉这面的结构了吧?啊,这面结构是什么?每行数据指量,那什么是一个人的购物车当中的一个商品,它的件数是多少对吧?这里边是不是存储的这些内容啊,没问题吧?OK,好,那你想一想,我要能拿到这张表的数据,我再去算那个购物车存量是不是就会非常的容易?对不对,你怎么算就行,只需要拿到这张表的数据,然后呢,我们按照谁做个分组,按照商品分个组对不对,我再对谁求个和,对SQ number,呃,SQ number求个和,那是不是就完事了,对不对,我是不是就能得到每个商品对不对,在所有人的购物车当中的件数之和了,没问题吧,这个其实就非常简单嘛,OK,所以说只要咱们能拿到这两板的数据,我们再去算这个购物车存量,那就会变得非常容易啊,是这样,所以说在这儿呢,我们就决定我们对这张表咱们做一个每日全量的快照,诶,然后呢,形成一个诶这个所谓的周期快照实时表,哎,这一点咱要给他搞清楚啊,好了,那所以最终呢,我们就诶得到了一个咱们这样的表,我们再回到刚才那张实时表啊,叫做什么呢?叫做交易域购物车,然后呢,周期快到十秒,诶咱们就得到它了,它主要是服务于咱们下面这张表,OK,那现在呢,我们就来看一看这张表的这个最终的表结构,它是什么样的啊来,我们把它CTRLC拿出来,来一起熟悉熟悉。
09:49
张表就完事了,这张表的表结构呢,相对比较简单啊,OK,好,那这张表的结构呢,也就是它的行,还有列呀等等等等,基本上跟我们业务系统当中这个card info是一致的,基本上是一致的,但是呢,里边有一些字段就是无关的,没有用的字段我没有放,我给它精简了一下啊,是这样的啊OK,那现在咱们来看一看,最终这张表的这个字段都有啥啊,先看表名啊,这个表名跟之前也不一样了,它叫做d WD trade的交域,对吧?Card是不是购物车呀,对吧?然后后边这个负在那写的是什么呢?是一个全量,对对吧,因为周期快照表它的分区规划应该是每日全量分区,对不对,这个搞清楚啊,然后呢,这边稍微的注意一下啊,各位同学。
10:28
其实我们之前讨论过一个这样的概念啊,我们说在这种事实表当中对不对?那这部分指代的是什么来着,是业务过程啊,这个表明这块是不是应该能够把业务过程体现出来啊,对吧?那在在这边呢,我需要给大家稍微的说明一下这个事儿,实际上我们之前讨论过一个问题,什么问题呢?就是说那种事物实施表它跟业务过程的对应关系应该是什么样来着,是一个事实表是不是对应一个业务过程啊,对不对?那种累积快照表它跟业务过程对应关系什么是一个累积快照时表对应多个业务过程吧,这个咱们之前也说过,对不对?那其实我们这种周期快照表跟业务过程对应关系,咱们之前没有提过,但是大家你可以想一想,你说周期快照表跟业务过程他们的对应关系应该是什么样的?
11:19
应该什么样的,你说咱就以这为例,你说我这个周期快照表,它对应几个业务过程。这是对应一个吗?这个其实这个没准,就是周期快照表跟业务过程的对应关系呢,你要硬说的话呢,它可能会对应一个,也可能会对应多个,这个其实没准这个东西为什么你想想,就咱们就以加购物车,以购物车这个表为例,那你想一想,你说我这张表当中记录的是什么,是每个人他的购物车里边这个商品有几件,对不对,咱记住是这个东西,好,那你说这个件数他会受到哪些业务过程的影响?是不是会受到加购的影响,同时也会受到减购物车的影响吧,没问题吧,那所以说诶,你像这种情况下呢,那你这个表它就会受到这个业务过程,就会这这个表就会对应几个业务过程,相当于是对应两个业务过程啊对吧?啊是这样,但是在某一情况下呢,我可能诶只会有一个业务过程会对这个结果产生影响,比如说我只增不减对不对啊是这样的,那那当然在这儿呢,咱们就不去呃讨论这种周期快照表跟业务过程的对应关系了啊,这个讨论它其实没有太多的意义啊,这一点咱们搞清楚就行了啊好了,各位同学,那所以在这儿呢,这个部分我们也不用去单独的去代表某一个业务过程了,对不对,因为这个所谓的周期快照表呢,跟业务过程关系,它也不是一对一的过程,它也不是一对多的过程,对吧?所以在这儿呢,你只要能表明你这个是对谁打的快照就OK了,咱们就是对购物车打的快照啊,这个理解一下就行了啊好了,接下来继续往下进行,下边我们来看一看,就是这张表的行列分区,呃,这张表每行数据呢,所指代的内容跟我们业务系统当中看。
12:54
Ino,这张表每行所指代的内容是一样的,OK,那它存储的就是什么东西呢?看一看,其实就是每个人,他的购物车当中的每个商品是不是有多少件呀,对吧,就是这个东西,好了,行,咱们明确了,接下来再看列啊列,我们还是分两部分,一个是维度,一个是度量维度,这相对比较简单,我们主要有几个维度呢?
13:13
呃,主要几个维度呢,一个是用户对不对,那还有一个是啥呢?还有一个是商品对不对,那目前看其实就是俩维度对吧,但其实这里边儿呢,我们还有一个维度,这个谁可以作为维度呢。分区字段其实也可以当做一个普通的字段去使用,对吧?那也就是在这儿我们是不是一天一个快照,一天一个快照啊,对吧?那玩意对应的是一天一个分区,所以这个DT呢,在儿我们也能作为一个日期维度相来,于是啊,是这样的啊,OK,好,那也就是说在这儿呢,你会记录我们每一天对不对,每个人的购物车当中每个商品有多少件啊,是这样的啊好,你可以把他们仨作为维度,那接下来呢,再来看这个度量,度量其实就是这个SQ number对不对啊,这个相对比较简单,好了,同学,那截止到现在咱们这张表它的行和列就清楚了,最后明确一下它的分区,分区它是负是全量分区,也就是说它是每天一个分区,然后每天的分区里边放的是什么呢?是不是应该是所有人的购物车当中这个商品的这个件数件数这样一个一一个结果呀,对吧?诶这个理解一下就行了,好了,那这实际上呢,就是咱们这两边的表表结构好了,表结构说完之后,我们紧接着来看一下它的这个数据装载,来看一下数据装载,那它的数据装载我们应该怎么去做呢?紧接着来看一下它的。
14:26
数据装载I怎么做呀?其实它的数据状载大家想想,你说它是不是应该会比较简单呀,对吧?这种全量快照说白了就是每天做一个全量同步,然后放在这个表分区域,那是不是理论上就完事了呀,对吧?所以它应该相对比较简单啊,当然了,还是老规矩,咱们先分析分析它的数据的流向应该是什么样的?好,那现在问一下大家,你说我每天往这张表里装载数据的时候,我应该从哪儿取税?啊,对应到我们这个业务系统,那肯定是谁呢?肯定是card info这张表对吧?当是card info,我们当初做全量同步的时候,咱们做过两个吧,一个是全量的,一个是增量的,对不对?那这回说咱们说咱们说应该用谁呀,肯定是全量的对不对,全量就是给周期快照表去做的对不对,所以这个理解一下,所以应该从这儿去取分,好,那这张表里每天的分区里放的是不是都是当天的全部数据啊,对不对?那所以说我们第一天的时候,我们从这张表里是不是应该拿它第一个全量的数据对不对,第一个分区的数据,那你拿到之后放到咱们这张表的哪个分区。
15:24
是不是就放在他第一天14号分区就行了,对不对,那你到了第二天呢?第二天是不是应该拿15号的数据,那他15号的数据是不是也是全量,那你拿到全量之后怎么办?是不是也是放在这张表是15号的分期就行了,对不对?因为从这儿你能看出来,那咱们这张本的数据装载了,你在做首日跟后续每日装载的时候,他们有区别吗?没区别是一样的,对吧?所以在这儿呢,我们就不用去区分首日和每日装载了,咱就只需要写一个circle就搞定了啊,OK,那这个circle怎么写呢?其实就非常简单了,来,我快速的写一下啊,来,我们来一个呃,数据装载,OK,由于不需要区分首势为咱写一个就行了,我们还是以十四二的数据为例啊,那首先我们一该是z from ods层的,是不是car in for,呃,这个负这张表啊,对吧?好,那完之后呢,我们拿一个V尔DT等于2020杠零六杠幺四没问题吧?好,那之后我们应该怎么办?是不是这需要什么字段,咱们拿什么字段就完事了,对不对?OK,你需要ID,那我就拿一个ID,那你需要这个U的ID,我就拿个U的ID,你需要一个这个SQID,那我就拿一个,那你注意观察。
16:25
咱这个作是不是能够直接拿呀,因为我们这是使用是不是data插座的全量同布对不对,就不用再从什么那个date结构体里边去拿了,直接拿就行,那这边呢,来一个SQ name,再来个啥呢?SK number,那该拿的字咱是不是就都拿到了对吧?哎,但是我们这样去学这个circle有没有问题,各同学有没有问题,目前看着好像是挺正常的对吧,是不是这个人购物车里边这个商品目前有诶一件啊对吧?诶看着好像正常,但其实是有问题的,这里边有一个小细节大家需要注意一下啊,Card info这张表当中是不是有一个字段叫做什么。Is older了呀,对吧?啊,大家还记得这个字段的作用是啥啊?就是是否被下单对吧?OK,其实这相当于是一个什么东西,是一个被删除的标记吧,相当于是大家都知道,如果我购物车里边有个商品,我下单了之后,这个商这个商品是不是会被从购物车里边移除啊,对吧?是,但是我们这儿会真的删吗?咱不删,我们仍然会存在这张表里,对不对?那只不过呢,我会怎么样呢?会给他is order这块是不是加一个标记啊,对吧?是这样的,那我们现在要统计的是什么?是每个人的购物车里边有几件商品吧,对不对?那你想一想,你说对于这种已经下单的,我们能算在里边吗?咱不能算,对不对?所以说我们往这张表里装载数据的时候,我们应该把那样的数据给它过滤掉,对不对,我们只要什么样的呢?诶,我们应该只要这个is an older的,它得等于多少呢?得等于零的才行,对不对,这个一定要注意啊,好了,那这个完成之后,那circle基本上就完事了,那最终我们再给它来一个in inside语就行了,In right table后边加谁DWD应该是交易域,然后是car,然后来一。
17:59
啊负那就完事了,当然是哪个分区呢?应该是当天的分区对吧,14号的全量那就放到14号的分区,15号的全量就放到15号的分区好了,那这张表的数据状态咱也就算是完成了啊来完成之后视频我给他停一下啊。
我来说两句