00:00
好,接下来呢,我们才正式的开始这个订单试时表的一个分析,它是一个累计型实时表,那还是按照我们之前的一个建模,我们的订单呢,跟谁有关系呢?什么时间,什么用户在哪个地区下了单,这个订单里面有没有参加活动,对吧?哎,涉及到这么四个维度。四个维度,那接下来你这里面就要有四个维度的信息,那看一下有没有,首先是时间。哎,什么时间创建订单,那我这里面的创建时间。哎,未支付状态,支付状态取消时间,完成时间退款时间,时间这块是非常完整的,对吧,每一个状态时间都给你记录下来,那再来用户。哪一个用户用户也有地区地区看一下哈地区这呢。省份ID嘛,对吧,哎,省份ID那还有后面还有一个属性活动,活动的话找一下。
01:03
对吧,这是活动ID,也就是说现在呢,我就把所有的属性啊,要准备的这个工作都已经准备好了。那准备好了之后拿去吧。对吧,老套路。往这一放啊,目前呢,就是整个啊,我们待处理的这个四时表就有了,那这个40表表里面它的数据哪来哪来的。肯定要找这个ods层啊,S层的oin找啊找ods oin ods层ods乘O等于负这。好,拿回来了,拿回来之后呢,我们来看一下能不能覆盖上面这些信息,需不需要添加额外的表,首先第一个订单ID没问题。订单状态没问题,用户ID没问题,在那支付流水号没问题,创建时间。
02:04
诶看创建时间是有,但是往下哈,往下的支付时间没有,取消时间也没有,完成时间也没有,退单时间也没有。这块有问题的,那很显然我们需要关联其他的表啊,关联其他表,那再往下,这是退款完成时间,有没有省份ID啊,省份ID这个有没问题,下一个活动ID没有对吧?哎,活动ID没有,那我们需要关联一张活动表。那再往下后面这有这个是原价金额,优惠金额也有,嗯,还有呢,是运费啊,运费也有,然后还有一个订单总金额啊,订单总金额这也有对吧?啊有了,比如说现在呢,有一个分期的地方,就是一个是活动这块缺一张表,还有呢,下面这个完成的是这个支付时间,取消时间,完成时间这几张表没有。那至少要需要关联额外两张表,那我们先来一个简单的把这个活动这个ID给准备好啊。
03:01
我这一上课就就各种报警啊,没办法,先关掉,呃,活动表先拿回来,活动表活动表。活动信息,那这里面的信息拿来。对吧,哎,活动表这个就已经有了,呃,有了之后呢,那我看看啊。这里面取的谁呀?活动ID啊。取得活动ID这个还不行,那它还不行,呃,我们要想通过这个信息获取活动ID,我们来看一下那个最终那个大图啊。这是怎么确定的啊,要学会这种方式啊,这个方法你会了之后,你再解决其他问题的时候就容易多了啊。
04:11
等他刷新一下啊行,现在呢,我们是订单表有,我们要拿什么呢?要拿活动的ID,活动的ID,那你看这一块呢,你得去这个活动订单表里面去找啊,这条线吗?这条线去找吧,那你看活动订单里面有没有我们想要的活动ID哈。活动订单表。活动订单表,哎,活动订单关联表,这张拿来。你说我们直接找活动表啊,你找不到。把这个干掉啊,换成它,因为你这个订单,订单这个表它在哪呢?它在这呢,订单表在这,你直接想拿活动的ID,那你得经过一个它,那经过它你看能不能拿到活动ID啊,那你看这张表发现哦,活动的ID在哪呢?在这放着,就这里面就有活动ID了,那以后呢,你拿着这个活动ID,你再去查这个活动表就OK了啊,所以说现在呢,啊,两张表已经准备好了,他和他未来要关联,那关联除了这个关联之外,还有呢,创建时间我们有,但是这个下面这个支付时间,取消时间,完成时间,这些时间我都没有,那这怎么办?
05:20
这些都有,那你看吧,这里面表我如何拿到。每张表的。完成支付创建啊,退款等等各种时间,你看围绕他谁能给你提供这些信息。谁能给我提供这些信息呢?哎,往这一看。订单状态表,比如说订单的任何一个状态发生变化,我都会向这里面插入一条数据,还记得吧?哎,会往里面插入一条数据,那就看看他吧,看他长什么样。订单状态表。这。哦,这个是第二文档哈。
06:01
我们拿这个第三文档啊。这是第三个文档,订单状态表。好,把它拿走。三张表已经集齐了啊,三张表集齐了,那这里面有一个订单状态表,大家发现订单状态表里面也没有我们想要的什么。呃,支付时间取消时间啊,完成时间,它这里面只有一个订单状态和一个操作时间。只有一个订单状态和操作时间,那么你想一想,这个操作时间它是什么时间?看一下。看一下原始数据长啥样啊?看一下我们的订单状态表,里面的数据是怎么存的订单状态?
07:00
这是订单状态里面的时间啊,引擎数据数据的话,比如说订单ID是3210 3210,那你再找一个3210,它的状态呢,是10011002。然后呢,3210呢,这位是105。啊,不知道你还记不记得这几个状态啊,编码第一个未支付。对吧,啊,然后已支付。支付,然后这是发过还是完成啊是完成。它是每一个状态发生变化,就会记录一个状态,那这个编码表呢,给大家看一下,这是1001对吧,编码表在。在这。你看吧,零。我把它截下来啊F1。啊,把它关掉。
08:00
再切回到原来的。这回能对一下。看的清楚一点啊,比如说3210这个订单1001 3210这个订单1002 3210这个订单1005,那分别对应的未支付。嗯,1002是已支付,1005是退款中,这反清洗了是吧?啊反清洗了。行,那我们现在的话,也就是说它的操作时间,那不就是我每一个状态对应的时间吗?你看101的时候,就相当于是未支付的时间,1002对应的是已支付的时间,是这个时间,1005对应的是退款中的一个时间。啊,那这样我就能拿到了啊,这样拿到了,但是呢,这里面由于是我多条信息。多条信息,记住了这整个一个状态,还有一个是110啊3210。我是三条信息表示的这个状态,我希望看到的什么呢?希望看到的是这是呃,未支付时间。
09:06
对应的是已支付时间,还有完成时间,分别对应着这是三月、13月、13月时,也就是说我需要把这个三行转换成一行。所谓的。对吧,啊,所谓的行转列三行转换成一行,这样的话,我可以拿着它跟后续的内容进行一个噪音处理,比如说取出这里面一个一个字段的值。然后添加到原始这个目标表上。因为你这三行跟我这个之前,如果你传进来的是这个一行,跟我这三行进行招音,没法找人呢。所以说我需要对这里面这些数据呢,进行一个整理啊,进行一个整理操作,不知道家这块是否清晰哈,是否清晰。比如说由于订单状态里面的表,它是一行代表一条信息,一行代表信息,它不是一个累积,累积的一个状态,不是把你这里面每一个状态都给你变成一个列。
10:00
这个需要我们自己去变。那自己怎么变呢,自己怎么把这个。嗯,把这个相当于是行转换成列呢。过来。所以说这个呢,是整个DW地层当中最难的一个了哈,最难的一张表。来,这是我们目标表的状态,然后向里面插入数据,那给大家提供一个思路,先把这个打开,看看我们怎么来实现啊。怎么实现我们相应的这个效果,这是整个一个插入的蛇口,一上来一大屏幕是吧,看起来眼花缭乱,那把它拆分成一块一块的,首先你看一下上面这块啊,这是一个,呃,变成非严格模式啊,是动态分区,往里面插入数据目标表对吧?目标表呢,就是DWD的o in,这个跟我们上面那个领用券是一样的,然后中间这块呢,是查询。
11:05
查询的话特点还是。有新的为空用旧的,否则用新的。对吧,啊用心的啊,这块是一个处理这块我们先不看了啊,不着急看它还是先从这块处理,比如说老的数据是谁。我们先解决旧的数据。只要是这种累积型式字表的话,你都给我先查老的数据,然后今天新增加数据是什么,然后他俩一进行join引。就完了啊,服装那思路整体思路是一样的,只是个别细节上稍微有点变化哈。这块处理它这块处理它来看,那这块代码在家再熟悉不过了啊,再熟悉不过了,比如说我想查询老的数据,Select形from d WD层它这张表。那查这张表呢,他查哪张分区啊。分区是因为我今天产生的这个表里面的数据,今天产生的表里的数据,它的操作时间。
12:05
哎,我这个超时时间不对啊,这个应该是cur time啊,这里面应该写错了。嗯,这个改一下吧,这个应该是可啊。代码里应该没问题,CR。可是。行,这还有笔误呢。笔误哈,行,我们来看一下哈,你说这块呢,我们获取的是create time,用create time作为每一个数据的分区。啊,用time作为分区啊,那行吧,那假如说哈,我们还有三月八三月九三月十啊,这几号的数据啊,这几号的数据,那么你这块一过滤的话,其实我本质的话只能取出三月八和三月九的,因为三月十今天数据。还还没有,还没有这个分区呢,对吧,还没有这个分区呢,那我通过这一过滤,我就把三月八三月九得出来了,说明三月八和三月九创建的。
13:03
订单在3月10号今天发生了变化,那我就需要覆盖三月八和3月9号整个所有分区的数据。跟之前的套路是一模一样的哈,一模一样,那这块结束之后,你说旧的数据我们解决掉了,那下面我们来看新的数据。啊,新的数据,新的数据哈,如果说正常情况下,呃,一张表就能把这些数据全部提供,比如说原来还是我们原来的这一张表里面就能把这些数据都提供,那就没有下面这个噪音的这个操作,这个事儿,只不过呢,目前我们现在遇到一个问题,就是这一块的数据。需要关联一下订单状态变化表。下面这块数据呢,需要关联一下订单和活动的一个关联表才能把它取到,所以说下面你这块你看到了有三个招引。造引这啊两个造引啊两个造引,那来吧,那再看这一块是怎么造引呢?首先第一块,第一块呢是取出来out sta也是状态表里面把它所有的行转换成对应的列。
14:09
对吧,你刚才看到了哈,是三行内容,我们希望的是变成一列。啊,三项内容变成三列。这样的话方便跟我们后续的一个招引操作,那你行三行,你跟别人怎么招引呢?没法招引。那我们用到的这个语法就是这块。乍一看这么一堆哈啊一堆。理解起来困难,先别着急,我告诉你这一堆干了什么事,这一堆干的事就是,这是order原始数据,看一下是不是长这样,这是订单ID。这是订单ID,订单ID,这是每一个订单状态的一个变化。比如说1001表示未支付,1002表示已支付,100表示正在退款中。啊,它状态对应的时间,那把这个数据这个我会变成什么样呢?最终我会把它变成map结构。
15:03
我把你三行变成一行,而且是map结构。你传进去对应的101,你就能取出对应的时间,你传进1002,你能取出对应的时间,传进1005,取出对应的时间。把它变成map,方便我们后续的一个操作啊,具体这块怎么来处理,一会儿我们单独来说。对吧,哎,好,那我能取出对应的状态之后,那就简单了,那我就可以跟order OS in for,你说原来这个黑字的。进行一个照应。他们两个招联在一起就能填补到这些数据。这些数据。不就全干掉了吗?全部能给它覆盖掉对吧?啊,覆盖掉只不过后面还差一个谁呢?差一个活动的,那差一个活动的,那我就继续的去再招人一张活动表。活动表唯一的就提供了这么一个字段,把它放过来。这就结束了啊,就是一个过程啊,所以说它它比那个领用券那个复杂,复杂在哪呢?复杂在这块,它需要三张表的一个关联,以前呢,你是这块直接把na的所有的今天发生变化了,对吧?哎,直接拿过来就行了。
16:13
就是正常情况下,如果说不需要关联的话,你直接直接这条鱼不就够了吗。咱们之前不就是select形from ods,然后把这里面的值一覆盖。有新的用新的,没新的用旧的。啊就结束了,那只不过现在它出来这么一个插曲,这里面是三行,但是呢,我这需要的是这么多列。啊,这么多列,那我需要这么一个转换,转换完之后你看啊,这块呢,叫log times。T Ms times,它是一个map结构哈,它是一个map结构长这样。这里的数据长这样,PV。K为K为啊长这样,那你看用法的时候呢,首先是它是一个map,那就传进去,对的K1001是否是空。那取出来的不是这个时间吗?如果它为空的话,那我用老的数据,否则的话我用新的。
17:04
这不还是吗?如果有有新的,那我就用新的,没有新的用老的。哎,整体呢,就是这样的一个啊,一个结构啊,一个结构,那下面呢,我们稍微来看一下这一块,这行代码它到底是怎么变到这儿的啊,怎么把这个三行内容变化成这样一步步来的。后面是获取活动ID。大家看一下怎么变的。首先呢,我们来看一下这个常用函数当中这行代码能不能看懂,我们就查的是ods order thiss log这张表,查了这张表,那select how ID跟订单绑定,然后contact拼接,刚才我们已经说过这个拼接,拼接这个怎么用的呢?哎,就是把你这个order states状态和操作时间拼在一起。什么意思?
18:01
啊。我现在做的事呢,就是把你这个,你这不是这个未支付吗。啊,这个是未支付,未支付和时间拼在一起,相当于它俩是作为一起。对吧,这一条这个订单这一条信息,然后呢,你再来下一个这个这个102的时候,什么时间,103什么时候时间,你说把它变成一个字符串。这样他俩就一一对应绑定上了。啊,你说这个订单的退款时间是这个,这个订单的未支付时间是这个,一起用去拼一。对吧,你看3210这个订单,这个订单呢,1001这个状态的时候,比如说未支付状态的时候的时间是这个。啊,然后32101002状态的时候,这个是已完成的时间是这样。
19:00
哎,现在呢,还没有进行行转列的一个操作。对吧,啊,没有变好,只是把它们拼在一起,好,那再往下走,拼在一起之后,下面呢,在原来那个基础上用一个什么呢?用了一个。用了一个。你说把你原来这里面拼接的这个数据,我又包了一层。啊,Client就能把你这个对应的行转换成对应的力。你看就是为了包了一层,什么也没干啊,你看什么也没干,就是包了一层。啊。那它取出来的值,你看这是第一个值,这是第二值,这是第三个值,那他怎么做到呢?它是按照这个订单ID进行分组。把相同组的数据拼接在一起。按照订单ID进行聚合,3210里面有三个状态,100 10010。
20:03
把你三行转换成一行,用到的是这个collect set。那试一下吧,看看这个效果,一定要分组啊,你这个不分组不行,得按照订单进行分组,把相同订单的这个状态拼在一起。有点慢啊。好拼接完了,拼接完之后呢,你发现啊左侧呢,全是啊对应的订单号,然后3210这里面10011组数据,10021组数据,然后10051组数据,它放到的是一个数组里面,这是一个数组啊。
21:05
对吧,每个里面对应的这个数据。这这一步,哎,这一步呢,是真正的把行变成了列,三行变成了每一个字段间的列,那变成它之后,我要对它这里面后续的一个处理,你看他跟我们刚才那个to map。多么的类似啊,我们可以用逗号把它们切割出来,然后呢,切割出来,切割成一个一个的这个字符串,之后再用这个等号,再把这个K取出来,V取出来这对应的K,这对应的V。Now v。对吧,这不就是典型的使劲通脉吗,这种结构吗?后续再。哎,我这里还没直接处理哈啊,我这里又进行了一个加上一个逗号。
22:01
进行了一个啥呀,这是切割。啊,进行一个逗号一个分割啊。啊,我用逗号对数据进行分割,对你刚才这个这一组数据进行了一个分割,看分割在干嘛呀。啊,我是取出来对应的值了啊,我这里面用这个contact ws取这个逗号用逗号。啊,加上一个逗号,那逗号的话啊,我这里面是取值啊,相当于取值,那这里面是对应的一个一个数组里面的值啊,一个一个数组里面的值,我把它们呢,取出来之后用这个逗号。拼接在一起了。用逗号拼接,拼接成这样。啊,这刚才是数组里的值哈,数组里的数组里的值的话,我得先取出来。取出来之后变成对应的字符串,这是字符串。啊,这符串跟你前面这个ID还是进行一个绑定,那看一下是不是我们想要的。在。
23:02
嗯。它是一个逐渐变化的一个过程哈。你开始的时候直接想到不太可能啊,这个像咱们嗯,好几个老师啊,想了这个两三个小时啊,先把它搞定。那来看一下这种实现方式,那现在呢,这个3210就是1001,它然后呢,逗号拼格,然后这个是1002,然后逗号把它拼在一起,这呢现在是已经变成了一个字符串了,刚才那个是数组啊,还不是字符串,那现在呢,这才真正的变成一个字符串,那变成字符串之后,那剩下的就简单了,这是逗号。这是逗号,咔咔两刀,然后呢,内部的话,这是K,这是V,这是K这是V,就是用等号再对它进行一个切割啊KV。就能把它取出来。那行看一下代码,那最后一步呢,就是调用这个s tr to map,其实就是string类型转换成map,那转换成map里面传的就是刚才这些数,只不过呢,第一个等于说第一个在外部先切的话用逗号切,然后里部的话用的是这个等号进行这一个切啊切割出来,切割出来之后呢,就会存到一个对应的map结构里面去,这是真正的map,那map的话你就可以传K取V,传K取V了。
24:20
来执行一下。终于到了这儿了哈。行,那现在呢,就能3210,然后里面就是对应的map值对吧?啊map值,那有了这个map,那那剩下的事就简单了啊,剩下的事儿那就可以把它给它一个别名,用这个别名去传K取位啊,那这个准备工作我们都做完了,那下面呢,我们开始这个具体的去实操一下哈。
我来说两句