00:01
来,咱们先把这个睫表语已经拿过来了,对吧?啊OK,那咱们开始去实现我们所需要的这个,呃,这个circle,那刚才按照我们的分析啊,啊,我们每天从咱们的买思Q当中打过来这个领券,领券这个业务的这个新增级变化数据,就包括领取记录,包括使用记录,诶问一下,那现在这个领取记录和这个使用记录,就这个新增级变化的数据啊,在哪放着。这本书在哪放着?是不是就在咱们的ods层的那个优惠券领用表的当天的分区里放着,对不对,行成变化就在这儿了啊,这个咱们知道了,嗯,好,那现在往下走,那我们要做的第一件事是什么来着,是不是先根据。咱们的新增级变化先找到谁,先找到我们要修改的那几个分区吧,对不对,那这个怎么找啊。首先我们要查的表是哪张,是不是肯定是事实表,那坐这呢,咱们select,咱们from哪张表应该是DWD层的fact common use这张表,那OK,下边where where dt,诶,这个DT等于多少?
01:08
这咋写?谁来选,咱们讲出先把所有字都选出来啊,这个DT咋写?这个怎么写?这好像有点问题了啊,你想你琢磨琢磨啊,我们这个DT应该这个分区应该有有是不是有多个分区啊,那多分区你直接等于这能写吗。好像不行啊,这个写写多少啊。不知道。啊,怎么找到我要修改的所有分区。怎么找的?哎,有同学想到了印对吧?哎,咱们可以印对不对,印下边是不是可以接一个紫查询呀,对不对,那紫查询怎么写呢。应该怎么写?是不是应该从咱们的今天新增级变化的这个数据当中去找谁,去找那个get time吧。
02:04
对不对啊,你找到get time是不是就找到你修改的那条记录它所位于的分区了呀,是不是就这个意思啊,所以在这块呢,咱们写一个,诶select select什么呢?Select get time from那张表应该是ods层的Co use这张表,然后那个分区字段咱们得过滤一下,2020杠零六杠幺四没问题吧?啊,那当然了,这个get time呢,这个格式跟咱们这个DT的格式是不一样的啊get time,因为这个字段是不是来来源于my circle啊啊来my circle my circle当中,我们get time这个字段它的类型呢,是datetime类型。Daytime类型,Daytime是什么意思啊,是有日期有时间对吧,年月日十分秒,但是咱们的分区字段呢,是不是只有年月日啊,所以这块咱们需要对它进行一个格式化啊,Data for吧。来,那select date format data four2mat,那这个函数使用的时候呢,我们知道怎么用吧,传俩参数,一个参数是啥日期字符串,第二一个参数呢,是啥啊,格式化的那个字符串那个格式对吧?啊,OK,咱们先把时间放进来,然后后边呢,格式化成年月日的形式,然后我们大家要知道啊,这个呃,对,YYY没错啊,大家要知道咱们这个嗯,MYSO,当是不是也有data for函数。
03:23
MYQL里边也有,但是它这个格式化字符串写法是不一样的啊,咱们have当中是什么?是这种格式YYYY,然后杠MM,然后杠DD,那MY当中是什么格式,怎么写呀?对百分2Y,百分号M,百分号D啊是不一样的啊好,那这样一来我们相当于就已经找到了我要修改的所有分区了,来看这能不能看明白啊,来我们先看这个子查询。这个紫查询我们查出来的是什么?是不是对get time进行了一个格式化呀?那这个get time你说它所返回的应该是什么?是不是有有什么有我今天的使用记录,对应的领取时间也有什么呀。
04:06
也没有修改啊,这个是get time,哪有修改时间没有,还有什么,还有我今天新增的领取记录的领取时间吧,对不对,因为咱们这个表当中当天的分句里存的是当天的新能级变化,对吧,所以这个get time是不是也有今天。对不对,能理解吧,但是你想一想,现在咱们这张表当中有今天的分区了吗?没有对不对,那所以说实际上你这个最终的这个结果返回出来的还是啥呀,还是所有你要修改的那几个那几个分区吧。这个没错吧,啊没错啊,所以说这个里边虽然有咱们今天,但是这张表还没有今天的分区呢,哎,所以说有没有无所谓啊,无所谓,也就是说最终这个子查询它所返回的,那就是我今天要修改的那几个分区啊,那几个分区。好,那这个现在大家这会儿能不能跟上。
05:02
能跟上吧,啊OK,那这时候呢,咱们既然已经拿到要修改内些分区了,那所以说咱们需要怎么做,是把它做先作为一个子查询,然后让它去和我们今天的新增级变化做一个啥full water到对吧,那所以这个东西先做一个紫查询啊,我们然后再注意啊,这是不是也有一个紫查询。然后这需不需要写别名?这需不需要写?不需要啊,什么时候才需要写啊,对select from一个查询的时候是不是才才需要写别名,那这个in后边这个子查询的是不需要写的啊,这不用写来我们看成X。啊,把它作为子查询,哎,CR,喂,那这个是不是一会咱们需要从这张表里去选呀,对吧,这个子查询,所以它呢需要起别名啊,比如咱们叫做诶,Old啊为什么叫old呢?因为这是我们从啊这个实时表当中查出来的这个老分区对吧?啊,需要是以前的数据,所以咱们起个名叫old啊那今天的新增级变化呢,我起个别名叫做new啊,一会咱们要new,那今天新级变化在哪啊,Set select,然后呢,From ods层啊,Co use,然后where dt等于2020杠零几零六杠幺四杠零杠四啊当然这个我们需要的也是所有字S星啊那这个呢,我们给它起一个别名啊,CTRLX。
06:18
来,走R。啊,来这块呢,我们写一个new啊写一个new好,那这两个子家裙我们需要对它进行一个全外联吧,来负auto u啊呃,负al和负状有啥区别。有啥区别呀?没区别啊,一个全称一个简称啊都可以啊,那完了之后呢,我们往下走,那O点啊,应该是用什么照呢?呃,ID等于六点。ID啊,用这个招,那当然这个咱们全写的星对吧,这个咱们为了方便查看啊,咱们把这个字段拿一下,呃,我就不拿星了啊,我把这个所有字段拿过来。来,这是我们这个new当中的CTRLC所有字段。
07:03
CTRLV啊来,那其实O跟new里边的字段呢,其实一样的啊,CTRLV啊,咱翻过来行,这个应该看着就比较清楚了啊,这是哎新的数据,这是旧的数据,那现在呢,我们从这个新旧的副auto John当中是不是去选数据就可以了呀,来咱们select,诶from这个select from出来的东西啊,这个select出来的最终这个东西是不就是咱们最终的结果呀,就是对不对,所以咱们在这儿是不是得考虑一个问题,是不是就得去判断,然后看哪些要改,哪些不用改,对不对啊,那接下来咱们看看这个判断的逻辑应该怎么处理啊来我们想一下,呃,这儿呢,比如说我这有一个哎表,这就是咱们这个所谓的old,那这个表呢,是咱们这个所谓的new to the new啊,那它们之间的对应关系是不是就是这种,刚才咱们已经分析过了啊,有公共部分,也有各自独有的部分啊,来你看看我们这个最终啊怎么办?哎,先问一下大家啊,大家知道我们现谁来辅照我们这俩表join咱们会有一个虚表,这个知道吧,这个虚表是什么样的呀。
08:06
这个虚表首先问一下,就以咱们这为例啊,虚表应该有有多少字段,这12345678啊,这每个子查区是不是有八个字段啊,那一共有几个字段这个序表。它俩负号当一共有几个16个字段呀,负什么叫join啊,我们还当中你可以这个表这个so当中这个join,你可以这样去理解,什么叫join呢?Join就是将两张表怎么做横向的,注意是横向的拼接起来吧,这是join,所以说你这个表八个字段,那个表八个字段横向的拼接是不是就16个了呀,这个虚表是有16个字段的啊,那还有一个叫做union对不对,Union是怎么拼接啊,相当于。是竖着拼接对不对?假如说我第一个子查询有八个字段,那第二个字查询也是八个字段,那它俩UN年之后几个字段,八个字段多少行,是不是行数是就翻倍的,相当于对不对啊,这是不一样的啊,这个大家要搞清楚啊,搞清楚啊行,那相当于我们这儿呢,是有16个字段的啊,这是old的啊,这是new啊16字段,那这个虚表就是哪部分虚表是不是就这张表啊,这是咱们那个虚表对吧?然后虚表这边它这是补now,这是不是也是补now啊啊,这是old的啊,这个是new啊OK,那现在我是不是应该从这个虚表当中去选我最终的结果呀。
09:29
对不对,那咱们就开始选了啊OK,那对于咱们这一部分来说,你要的应该是什么。是O的这边的字段还是new这边的字段,那肯定要O的呀,就这部分相当于是没变的对不对,没变的我就直接拿回来就行,拿new也不行啊,New这边是不是全是no啊对不对,能理解是吧?OK,那往下走,那这部分呢。咱们拿。这当然都不是闹逗的,也有拗,也有对不对,咱们拿谁?拿old还是拿new,肯定是拿new对不对,因为我新的这个记录里边啊,注意新的记录里边是不是我已经有那个使用时间了呀,那旧的记录是不是还没有使用时间对不对,所以说我是不是应该拿用啊,那应该拿这边了啊拿这边了,那对于这部分呢。
10:18
这部分拿谁,这部分肯定拿new啊,是不是肯定拿new,因为old这边是no嘛啊,肯定拿new。所以说咱们是不是有这样的三种情况啊,对不对,那其实这三种情况啊,我们可以用一个逻辑给它概括了。你们总结一下啊,这相当于什么意思,怎么样一个逻辑,相当于这一部分我拿谁拿old的,那这部分我拿谁拿new电是也是拿new,所以咱们就可以做一个这样的一个统,统一啊,怎么统一啊,你就看新的是不是no。新的如果是闹,那就是这部分呗,那我就用谁旧的新的不是闹啊,不是闹,我管你是新增还是修改,对吧,我都拿新的就行了,对不对,那是一样的,所以最终咱们这个逻辑就是做一个判断,就看新的是不是闹,新的是闹用旧的,新的不是闹,用新的是不是就搞定了呀,哎,这就是我们最终的结果,那所以最终咱们这个circle啊,你在这选就行了,那这个是不是要判断一下新的是否为no啊,这个用谁呀,刚觉得是不是用if就行啊,来咱们if if,哎,咱们第一个字段是谁,第一段是ID,对吧,那选if new.id。
11:28
啊,你就判断一下is no啊,如果是no是no用谁用old.id否则用谁new.id。没错吧,那剩下是不是每个字段咱们都是这样去判断,If,哎,New点该谁了?该这个呃,Co ID了啊,Cou p Co ID,然后呢,Is,哎,No啊,然后呢,如果now,那我就用old.co ID,否则我就用new.coen ID,是不是下边的每个字段都是这么写呀,都是这么写啊,都在这儿呢,我就不用再一个一个写了,咱们把这个文档上粘一下啊,哎,就都这么写就完事了。
12:08
来咱们粘到哪儿,咱们一共几个字段,一共八个字段对吧,刚才刚数的对吧,一共八个字段,那我这儿呢,是不是就拿八个字段就够了,CR。你看是不是发哥12345678没错吧,哎,OK,那正常到这是不是就写完了呀,这个三个词二考写完之后,最终咱们上边写一个啥inst是不是就行,Insert overri table dwd,然后呢,Fact copy use,后边咱写一个啥是不是写partan part里边呢,咱是不是写DT等于。什么不对,是不是得写这个呀?哎,那现在问题来了,咋还写这个?因为你知道你最终选出来这个结果呢,肯定是来自于多个分区的啊,所以放也得放回到原来分区啊,那这个写一个肯定是不行了啊,一个不行那怎么办。
13:03
哎,那有同学说了,我这写一个什么get time,这能那么写吗?不能,这个里边是不能用这种函数的啊,也不能用字段啊,你只能写死啊,但咱们这写死肯定是不对的,所以说我索性就怎么样啊,我索性就不写了啊,我就不写了,就写一个DT分区字段。然后咱们怎么办呢?啊,咱们用动态分区啊,用动态分区啊,动态分区这个原理是什么啊,给大家回忆一下啊,动态分区的原理就是这样的啊,你要想用动态分区,首先你这个插入的语句当中,这不能声明具体分区,那那就只需要声明谁分区字段,只要告诉他你的分区字段是是谁就行了,然后之后呢,你需要在你insert下边接的这个select里边啊,因为咱们这个表一共有八字段,对吧?哎,你得在它满足它这个八个字段的基础之上再怎么样。在最后边呢,再多选一个字段。啊,我这两本一共就要八个,但是你得选九个啊,然后最后一个钻是干什么用的呢。
14:03
就是分区用的你最后一个字段的值是多少,那你就会进入到DT等于多少这个分区里边。能理解吧,那就说咱们这这个场景,你说我们这个下边这个值多出来这个字段应该选谁呀?是不是先选get time啊,对不对啊,那选get time的话,我们得想一下啊,那我现在这是old,这是new对不对啊,那两边是不是都有get time这个字段对不对?那你说我选old的get time还是选new guy time,选谁选谁都不行。你选O的这部分是不是no,选这部分他是闹对吧,那所以怎么办,是不是用这个就行判断呗。哎,是不是它啊,应该是这个,这是不是已经给你准备好了呀,判断一下,Old为now就用old,就用old,哎不是new为now就用old啊,New不为呢就用new。这不是他就能选出来一个准确的get态吗?那所咱们选他就完事了呗,谁选它CTRLC。
15:02
啊,CTRL你就放在这儿。哎,放这之后呢,那这个当然咱们得去处理一下啊,还是一样的道理啊,Get time是年月日十分秒,咱们需要把十分秒去掉啊,需要给它进行一个格式化啊,所以说data form啊,然后再把这一大串放进来,逗号啊,来一个什么东西,YYYY杠大M大M,然后杠BD。行,那到这儿了,我们就算是把这个思索写完了啊,当然呢,你要想使用动态分区,那必须得开启一个参数吧,是不是动态分区有一个参数叫做什么动态分区的这个非严格模式啊,对吧,你需要把这个参数给它放在这个位置。啊,那这就是我们这个完整的小circle啊,那到这一步呢,咱们这个呃,So就写完了,其实你看一下这个circle它的这个逻辑,诶这个circle多吗?哎,这个so不多,咱们这丢了个东西吧,丢了个on啊啊,这个so其实没多少行对吧,而且这个大家一看感觉也挺简单的,对吧?那其实这边难可能就是难在这个逻辑上面了啊好,那我把视频录一下。
我来说两句