00:00
诶好,那接下来呢,咱们来简单的回忆一下,就是这个动态分区的两种模式啊呃,我现在呢,我再把咱们之前爆破的那个三呢,再给它执行一下啊来我再执行,呃,然后执行的时候,他这其实说的很清楚啊,他说动态分区的严格模式它要求什么。嗯,At least是至少得有一个,呃,这个static partition对吧,就是至少得有一个,嗯,怎么了怎么了啊,行,现在好了吗?有了吗?嗯,我是看不见你那个啊,我再重新控一下啊。呃,你有那个窗口吗。你稍微等一会儿,他就应该就出来了,嗯,可能比较慢。呃,我先把屏幕停一下啊,呃,来,那咱现在先继续往下走啊,就这其实已经说的很清楚了,说的是什么?他说说动态分区呢?呃,这个严格模式它要求是是我们至少得存在一个静态的分区啊,对吧?就什么意思啊?呃,就是首先大家得知道就是我们一个分区表,那它实际上呢,是可以有多级分区的,对吧?这还有印象吗?呃,对吧,比如说我可以按照年先分一个区,然后在年下边呢,我再按照月是不是进行分区啊对吧?你这个多级分区实际上是需要用到几个分区字段的呀,是多个分区字段的对吧?也就一张表我们实际上是可以有多个分区字段的,这一点大家需要搞清楚,那这个所谓的严格模式什么意思呢?就是我们在往一张表里边去insert数据的时候,咱们这个位置你至少得有一个N区,自的值得是固定的,然后其余的你可以用动态的方式,这叫严格模式,OK啊,那当然咱们现在满足这个严格模式吗?
01:52
那显然是不满足,为什么?首先第一点,咱这张表是不是就只有一个分区字段对吧?而且这个分区字段值呢,我们还不能给他,那所以我们这肯定不是严格模式,肯定不满足严格模式,所以只能是用这个所谓的非严格模式了,非严格模式呢,就没有这个什么,至少得有一个静态分区字段的这个要求了啊,所以说在这儿呢,我们将其设为这个所谓的非严格模式,那就能把这个问题解决,呃,然后咱这儿呢,呃,这个怎么去设置这个参数啊,这个参数的设置方式呢,也是两种呗,一种就是我们直接在这个位置给它塞一下,对吧,那设置为这个非严格模式,那就完事了,当然这个在这儿设置呢,它是只在当前绘画生效了,对吧?呃,完之后呢,我们还有另外一种方式,就是把它放在汉赛的下边,是不是可以全局有效,呃,是这样的对吧?这个注意一下就行了,那在这儿呢,我们就直接在这儿给他set一下就行了,呃,完了之后呢,呃,这个三我们暂时也就不再执行了啊呃,执行的话我们是不是也没有数据啊,对吧?来这一点咱们稍微的理解一下就行了啊好了,那到目前为止,这个咱们就算是搞定了,来视频我给他停一下啊。
02:51
呃,来吧,各位同学,那咱接下来呢,一起来想一想,这个第二种方案应该怎么写,第二种方案文档上没有啊,所以大家也不用看文档,咱就一块分析就完事了啊来,我们呃,把这个PPT还给它点开,咱们继续分析啊,诶,其实甭管是用哪种方案啊,咱们需要的两部分数据是不是肯定是这俩呀,对吧?啊这样的啊,OK,好,那现在问题来了,数据摆在这儿了,对不对?我怎样操作是能够拿到我们想要的那两部分数据的,对吧?哎,只要能拿到两数据就OK啊,刚才咱们是用作全外联,对吧?那我还能不能用另外的一种方案呢?
03:24
其实之前就有同学说过啊,可以先干啥呢,是不是先对他俩进行一个妖孽呀,对吧?OK,那你琢磨琢磨,你妖孽完之后怎么处理呢?衣服你完之后怎么处理?就是油拧完之后啊,还用过滤,怎么过滤。其实咱们用得着过滤吗?同学们,其实对于这两部分而言,你其实用不着过滤,为啥你要给它油腻到一起,你想一想啊,全量最新是不是指代的是这一部分,过期的是不是这一部分对吧?这些其实都是我们想要的结果吧,对不对,你根本就没有剩下的东西对吧?所以说过滤应该是用不着过滤啊,看到。
04:06
完之后呢,就修改日期就完事了,对不对,那我修改哪条呢。对,是小花小强,你写三后,你得找到小花小强才行,对吧,你得找到他俩才行啊,怎么去找到他,你得能精确的去识别这个人才行,对吧啊。而且你还得保证啊,你优念完之后对不对,那我这个全量最新,还有那个过期的数据,是不是相当于就混在一起了,是这个道理吧,混在一起之后,将来你是不是还得通过一个音刺给它往外写,你得能够区分开是不是才行。没问题吧,哎,这里边其实还是有点难度的啊,怎么去实现这个东西呢。其实说实话,你只要能把我这个过期的数据跟全量最新的给区分开,对不对,那像诶咱们改日期那个是不是也就能实现了,你只要能区分开,你知不,你是不是就知道就就应该去改谁了呀,对吧,改谁呀。
05:00
就改那个是不是过期的就行了,对吧?啊是这样的,所以说咱这里边儿最核心的一个问题就是啥,就是你把它优念到一起之后,怎样能把全量最新和那个过期的状态给它区分开。对不对,怎样能区分?大家在这儿能不能想到这个具体的方案,同学,我们好好想想。啊,我可以提示一下大家啊,这里边儿可以用到开窗。啊,区分的时候能用到开窗。嗯,想想怎么能区分开。嗯,好,那这个就时间到了啊,时间到了不能再给时间了,来咱们一起来分析分析,这个到底怎么实现啊呃,首先咱们需要把他们union在一起,就是union到一起之后,咱们得到这个数据是一个什么样的,就是首先呢,你会发现就是union完之后,对吧,我们这个结果里边有的用户他可能会有两条状态,有的用户呢,可能只有一条状态。
06:02
这个应该是能想到的,对不对,OK,谁谁是有一条的呢?你比如说一到五它就只有一条状态,那八到九也是只有一条状态,对吧,那六七是不是各自有两条状态没问题吧?OK,好,那完了之后我需要做一个什么样的操作呢?啊对,我做一个这样我加一个rank开窗函数。NK开窗函数,OK rank开数函数,你是不是得有over over里边得有partition,得有order啊,对吧?Partition爱谁?就按用户ID对不对,好,那完之后呢,我这个run,我这个O,我按谁这个排序呢。按谁排序,按照start date进行排序,你你注意观察,这有一个star,这是不是要一个star对吧,同一个人是不是一个十四一个15啊,对吧?啊,那我排序的时候,那我是升序还是降序呢。我生意还是降序,哎,你我我这应该是怎么做的,我降序排序,我降序排序啊,OK,我为什么要降序呢?你想一想啊,我要降去了之后,咱们得到的结果是个什么样的啊,就是对于那种只有一条状态的用户而言,他加的那个排序是几,是不是这都是一没问题吧,OK,好,那对于那种两个状态的用户而言,它这个是怎么加的,因为你是按照star的是不是降序排去压,对吧,所以这儿你加的是几是一,你这边加的是几。
07:19
二嘛,对不对,六这不是一二,然后七这不一二嘛,你加上之后应该是这样的一个状态,对吧?好,那现在你有没有区分开这个新的状态和旧的状态。区分开了呀,对吧,只要你加的RK等于一,那我这个状态就是一个新状态,只要RK等于二,那它就是一个旧状态,这新老状态不就区分开了吗?区分开之后,那我们一会儿比如说我要想去改日期,我怎么改就行了,哎,等于二的我就改,不等于二的我就不改,对不对?那完之后我再进行动态分区的时候呢,等于一的我给它放到九九的分区,等于二的我给它放到是不是过期分区,那就完事了,对不对?那实际上呢,这里边核心逻辑就是怎样能把这个新的和旧的状态区分开啊,就是这么个逻辑,加一个乱开窗就就区分开了啊OK,好,这个思路大家现在基本上应该明确了啊,那所以接下来呢,我们就一起来把这个circle给它写一下,实现一下啊来,那现在我们一起来看,呃,其实这两个方案虽然不一样,但是他们需要的数据应该是一样的吧,对不对,那所以说我们还是把这俩紫查询拿出来,一个是old的,一个是new,对吧,先把old的拿过来,我们放在这个位置没问题,对吧,那这个呢,往后退一下啊。
08:24
这个再往后退,对对啊,这是一个,然后我们再去找一个,再找一个new new应该是从哪开始,New应该是从这儿开始往下走,到到这个位置,诶不对,多了,应该是到到这儿吧,对不对,这是咱那个new对吧,而且是处理好的拗只留下,呃,就是每个用户只留下一个状态的那个拗对吧?好,再给他拿过来往前退一下,这个往会往往后退是摁摁那个shift加type啊shift shift加type是往回退,Type是往前退啊,往前走啊好,那这个大家呃,应该是OK了,那这样一来的话,我们这两个数据新和旧都拿到了,对吧?那接下来咱们要干啥?是不是就直接对他俩进行一个是不是union all的这样一个操作呀,对吧?好,那union之后,那接下来干什么来着,咱们刚才说过怎么做来着,是不是需要先加一个rank开装啊,对吧?OK,那这时候你需要怎么办?是不是需要先以这个东西作为一个子查询,然后再去加那个RA开装啊,对吧?你得先以它做为子查询啊,OK,那完了之后呢,我怎么把它作一个子询呢?前面就讲过两个。
09:25
查询两个select是不是union在一起,你就把它当做一个select去处理就行了,对吧?啊,那一个select要作为子查询怎么做,是不是给它放在括号里起个别名就行了,对,咱这也是一样的,直接把整个给它放一个括号里边,呃,然后呢,里边来放进来之后呢,我们把这选中,然后再往前推一下这个东西给它起一个别名,咱们管它叫做诶T2就行了啊好好,那现在呢,我们就可以是不是select完了之后呢,辅让这个T2来对吧?OK,那现在问题来了,我们现在是不是需要从这俩select union的结果里边去选择咱们这个每个字段呀,对吧?好,那现在我这个字段名怎么选。
10:03
对不对。这是我上面的这个,呃,这个这个查询对吧,那这个时候我下面查询对吧?好,那我这个字段名怎么选,你要知道union咱们是竖着拼对不对?好那我选字段的时候,我是选第一个表的字段,还是选下边这个表的字段,选谁呢?哎,这个大家给大家说明一下,就是多个select进行union对吧?那他们的结果的字段是取的第一个select自查询的字段是这样的,所以在这我们要想选这个UN结果字段是不是选这儿就OK了对吧?好,那现在的CTRLC咱们给它选出来,诶放在这个位置,那这儿呢,给它往回退一下啊好,那刚才提到了,我们这儿呢,需要是加上一个rank开窗了对吧?好,那现在咱们就咱们就加一下啊,那在这儿呢,我需要是不是来一个rank,然后over里边写一个part by by里边写谁是不是就写ID就行了,对吧,后边再来一个older啊,这个BYBY谁by start date是不是就行对吧?那之后呢,我们后边需要写一个啥,需要写一个降序吧,DEC降序排序才行啊,在这呢,取个别名叫做RK对吧,那接下来呢,我们就可以根据这个RK是不是去搞事情了呀,对吧?好,那接下来呢,我们继续往下进行CTRLX,那这边我们放一括号。
11:12
呃,给它放进去,CTRLV来这个往前走,呃这边我们起个别名叫做TT3啊T3,然后呢,我们再从T3里边选择一下我们所需的数据啊,From,当然了,你选字段是不是还是选呃这些字段,但是得截止到哪,截止到start date对不对?End date是不是有些地方咱们得调整一下呀,对吧?来来拿过来,那谁需要调整来着。2K等于二的是不是得调整那个N的date 2K等于一的咱不用调整了,对不对,OK,那现在呢,我们就呃需要做一个什么呀,做一个if判断嘛,对吧?哎,If一下if什么东西,If r k等于二对不对,那就说明它是一个过期的状态,过期的状态我们就应该返回是不是前一天的日期啊对吧,那我们在这儿呢,就来一个data萨对吧?然后呢,当天日期2020,然后呢,杠零六杠幺四呃幺五对吧,幺五给它放进去,后边呢,我们给它减一个一对不对,那这就是等于它,那否则的话呢。
12:09
那等于一怎么办呢?等于一你是不是就不用改呀,等于一是不是直接取那个n date就完事了,对不对,这个就不用改了啊,这个要注意,那完了之后,这其实得到的就是我们最终的那个N的date吧,没没没问题吧,啊好了,那这个就是改完的了,那接下来我们去干啥?其实接下来就省事了,我们是不是已经得到最终结果了,相当于。没问题吧,这里边是不是已经有全量最新也有新增级变化了,呃,有权利也有那个那个过期了对不对?好,那现在已经都准备好了,我们现在要做的工作就是啥,是不是差一个ins inside对不对,那现在呢,咱们就iner对吧,我来一个in inside or right table也是DM user,这个后边是不是part提里边咱写一个啥呢?这个part里边写仍然得动态分区吧,对不对?那因为咱现在这个返回的结果里边既有呃这个最新状态也有过期状态,所以也得写到俩分区,在行来所所以说也是动态分区,只写个地基,好,那现在问题来了。
13:04
动态分区字段的值咱们怎么写?是不是也是可以根据那个RK去进行判断呀,对吧,等于一的咱前面说过都是什么最新状态对不对,等于二的是不是都是过期状态,所以在这儿是不是也是给他用if加上一个判断就行了,对吧?如果RK等于一,那我就给它返回一个多少。那就9999,然后杠12杠三幺,这就是进到最新分区了吧,对吧,那如果说我是一个呃过期的状态,那我是不是就是放在咱们这个前一天的分区里,那就完事了,对不对,CTRLC咱拿过来OK,那这样一来的话,那是不是这个问题咱也就搞定了呀,没问题吧,诶这个其实相对来说也是比较简单的啊呃,其实大家大家现在你你自己感觉感觉你说哪个单哪个哪个哪个简单,下边这个要简单一点,其实说实话也不一定是下面这个简单,可能是因为大家有了第一个的基础了,觉得第二一个好理解了,这样的你要是上来就先看第二个,可能会觉得这个第一个简单啊,是这样的,呃,两个方案其实差不了太多啊,差不了太多行,那这两个方案呢,大家都呃大概了解一下就行了,就是这个拉链表呢,相对来说还是比较重要,还是比较重要的啊,这个不管是在呃面试的过程当中,还是说以后工作的时候,诶,遇到类似的表,这个其实都是有一点难度的啊,是这样的啊,所以大家这个拉链表一定要重视起来啊,咱们就重点掌握哪些内容就行了呢。
14:26
第一个就是咱首先得知道拉链表的结构是什么样的,我们得知道拉链表一行指代的是一个状态,对吧?那我们知道它里边的这个两个特殊的字段,开始和结束日期,它的含义是什么,对不对,这是结结构上咱得搞清楚。那第二一个呢,就是咱得知道就是拉链表的意义是什么,对吧,为什么要去做拉链表啊对吧,它是能够更加高效的保存历史状态的,对吧?但是也不是说所有情况都高效,得是缓慢变化为是不是才有效啊,对吧?诶,这是它的意义。然后再有一个呢,就是拉链表的使用,咱得会怎样拿到全量最新,怎样拿到历史上某一天的数据,咱得会,对不对,这是一个。然后最后一个呢,就是拉链表怎么制作了,对吧?所谓制作呢,说白了就是怎么写这个circle呗,对吧,这个写circle这个这些circle语句咱们不用记,但是呢,这个大体的思路,大体的逻辑咱们得诶能够说出来才可以,对不对,我们需要拿到它,拿到它然后进行优念也好,进行全外联也好,等等等,这个大体的逻辑咱们得能够清晰才可以啊,是这样的,主要就是这样的几点啊,好,完成之后视频我给他停一下啊。
我来说两句