00:00
好,接下来呢,我们看一下4.4.12,那这个呢是非常重要的啊,非常重要的啊,也就说相对说比较难的,如果难的你能搞定的话,那简单的就不用说了啊嗯,来一下这个优惠券领用40表,这个应用券领用40表叫什么呢?叫累积型。快照四时表,那累积型快照四时表长啥样?不知道大家这个还有没有印象啊,之前咱们在讲这个四时表的时候。嗯。它是怎么定义的,来看一下。累积型快照时表,累计型快照时表呢?表示追踪事物事实的一个变化。其实就是一个事物的一个从开始到结束的一个完整状态,咱这边举个例子,就是订单,订单从开始下单,一直到订单签收,整个这里面的所有时间的一个变化。哎,都在这里面,比如说这个订单开始时间是三月3月8号订单打包时间。
01:05
3月8号发货时间3月9号,3月9号签收时间3月10号,哎,它会把你这个整个订单的一个生命周期,从开始到结束,一个完结状态,全部插入到这一行内容里面去。这就是照表数数呗。哎,难点在哪呢?难点在于我们是在have里面操作。Have的特点呢,是不允许你去改某一个字段。啊,或者改起来比较麻烦。对吧,哎,我要修改字段的,这你这不你要在买Q里面,这太简单了,来一条我插一条,来一条插一条往里面填呗,啊没有的默认就保持为空呗。这没啥说的啊,难就难在它在have里面,那怎么操作呢?
02:02
啊,单独改一行肯定不容易。那在还里面操作哈,记住我要想改一张表的数据,改一行比较难,那我就改你全表。改这一行我做不了,那我把你整个表全覆全覆盖,因为有一个叫override嘛。啊,Over,改一行,改不了就改全部全部,那先记住这个思想啊,那下面我们回来啊,继续看我们这个表。优惠券你用40秒。呃,优惠券领用市值表呢,首先还是看一下它的建模,我们这里面关心它的维度有哪些优惠券领用事实,什么时间,什么用户领了哪些优惠券。哎,度量指的是个数。这就OK了,对吧,啊这么几个值,那你看一下这里面的建表语句。建表语句里面是什么时间,我看一下啊,什么时间内有没有。
03:04
卡住了,稍等一下。呃,看一下什么时间优惠券领用的时间呢,包括这个三个值,一个是领取时间,还有一个优惠券下单的时间,用这个优惠券去下单了。还有呢,在支付的时候用了这个优惠券,这是时间相关的。这么三个下一个呢,是用户,用户找一下用户ID,用户ID在这呢。对吧,用户ID优惠券ID优惠券ID呢,是这优惠券D。哎,也就是说我们这个事实表当中关心的三个维度都有了,时间对应到这用户对过来啊,对到这儿用户券对过来啊对过来行,我看看其他还有啥其他的啊,这里面还可以关联订单的对吧,还可以关联订单优惠券状态。
04:03
嗯,就没了就没了哈,那像这个度量值,这个个数个数怎么求呢?之前不也说了吗,你可以count一下这个全表啊,比如说count一下啊,多少人领用了这个优惠券也是可以的,那行,那现在呢,就是这张原始表已经有了,有了之后还是老规矩,直接拿过来。往上面一放,也就说要像这张四值表里面插入数据,那插入数据的话,这是一个优惠券,事实去ODI层找优惠券表对吧。啊,找优惠券领用表。Ods层找优惠券,领表ods。啊,这个是优惠券表。嗯,领用表呢,这。拉过来往这一放,也就说我们要像这张表里面插入数据啊,你先别研究那个,呃,这个几个变化,那个事件啊,先看看这些字段够不够。
05:09
ID没问题,ID没问题,Order ID没问题,呃,状态没问题,Get time using time using the time哇,发现这个好简单呢。那我们的想法是这样的。往这一放。往这一放,中间字段一替换。理论上来说不就结束了吗?对吧,大家想跟以前好像一样,那为什么说海哥说难呢,我们来看一下啊,来看一下啊,那这里面优惠券领用时表。难点在于哪儿呢?难点啊在于你这个优,呃,这个优惠券领用看啊对嗯,把这张图打开啊。
06:17
卡住了。比较。稍等一下啊,别着急卡住了。吧。行,嗯,看一下这里面为什么说难呢哈,来我们来看一下,比如说啊,这里面我假设了一下,假设了一下第一天里面有3月8号有人领券了。啊,有人领券了,嗯,哎呀,我这里面。啊,这个得干掉啊,这是now啊,默认是三月3月8号领券了,那第一个时间呢,这是领券的时间。那第二个阶段呢,表示是下单的时间,第三个呢是支付的时间啊,这个对一下哈,啊,这是3月8号,然后呢,到了3月9号的时候呢,还有人领券了。
07:04
领取时间三月九三月九三月九三月九三月九这个呢是用户,你说123455个用户,这个呢是第零号用户,没问题吧,再说前两天都有人领券,但是没有人使用。到了第三天的时候。第三天的时候呢,这个优惠券啊,既有被领取的。你看这是3月10号有人领取了,同时呢,又有人使用了你之前的这个优惠券。比如说你3月8号这个券,有人在3月10号在今天被使用了,那还有一部分呢,这个这个五号用户,五号用户3月9号领的券,他在3月10号拿着这个券去下单了,同时呢又进行支付了。又进行支付了。那我希望最终希望的结果是什么呢?我把这个后面行。点快了啊。嗯。我给大家看一下这个期望的结果啊。
08:04
行啊,你前面这是输入数据,输入数据我期望的结果是变成这样。变成一张表,里面要记录的这个每一个券的一个变化状态,比如说你3月8号这个3月8号是在3月8号领的券,但是呢,他在3月10号进行了一个下单使用。对吧,啊,这个你要干掉啊,这干掉,然后呢,你3月9号,其中这个五号,这个五号用户他3月9号。是的,3月10号。他用来下单使用了。然后3月10号同时又拿进行支付。那你像刚才那个呢,你直接就呃,查询完,你说查询出来当天的数据直接往回一插。那他只是记录了当前这一天的一个状态。嗯,只是记住这一天的状态。那你原来这个数据呢,你没法要,你怎么覆盖。
09:03
啊,是这样的。比如说我要把这个记录的状态一条一条的去更新。啊,一条条更新,那更新起来,那原来简单粗暴的直接覆盖不行,那不行怎么办呢?哎,来先看啊慢慢看这个口。还是看那块儿啊,这是三天的数据,先把这三天数据搞清楚,搞清楚完之后呢,我们希望呢是哎,你这个券什么时候领的,什么时候用的啊,什么时候这个被支付了。形成一条记录。那一条记录怎么做呢?我们这里面的这个DT啊,分区,分区就不能按照像这个你这个操作时间,这相当于操作啊,这张表里面都是操作时间,什么叫操作时间领用券了。领取券的时候,我要插入一条对吧,下单了,你有这个下单时间的变化,包括有这个这个支付时间的一个变化,那它都能作为一个新增和变化,比如说每天获取的这是一个新增和变化的数据。
10:06
然后DT呢,是按照优惠券领用的时间分区。为什么要拿这个优惠券领用这个时间做分区呢?因为拿这个开始的时候。比如说第一次领取。这是这个事件的开始,事件的开始拿它做分区的话,你不管日后,这是3月8号啊,假如3月8号对这个订单做了一个分区,那么你3月9号对这张券进行了一个下单。那我会把这条数据。你说你是3月8号领的券,把它盖到这里面去。那如果你是3月10号进行了支付,那他还会找还是找这个事件开始的时间,这张表,我把它呢往这里面去插入。哎,所以说这里面一定是事件的开始的时间,用它去做这个分区,然后往里面去累加嘛,你怎么体现累加的过程啊。
11:01
就是有了事件开始,然后产生一个盖过去一个,产生一个盖过去一个。这样一个流程哈。啊,可能一上来就晕了是吧,啊,一上来就晕了,因为我们要做的是一个累积的过程,是一个累积。累积的话,他就要记住这个状态的每一次的一个变化,有get time的一个变化,Using time被使用的变化。那这怎么来的呢?哎,先拿到这个最开始的时候创建一个分区之后呢,往里面覆盖覆盖,那你3月9号也有对应的新新增的数据,对吧,你看这里面3月9号这里面都是新增的数据。那我到了3月10号对这个数据再进行修改,那再覆盖。啊,历史的一个覆盖哈。行,那先看一下这个circle啊,先看一下,那这里面我们怎么来做啊,怎么来做,怎么来做呢?我先先保住一点领用券它的get time作为分区。事件的开始以后,处理这种累积型四次表,就说用这个事件开始的时间作为分区就行了,它作为分区之后,我执行了这么一条蛇口。
12:09
看这道时候能不能理解啊,能不能理解啊,我查询数据啊,查询数据,查询的数据是哪一层的数据呢?是DW def fact consume use。那这个同学该不明白了,说你这个还没创建这张表呢。对吧,这个是我们要DW要创建的啊,要创建的确实是这样的,那这张表呢,其实是这是一个O,比如说查看你以往的历史的数据。数据,那这个历史数据查哪些呢?哎,查的数据呢,是date in在下面这里面对应的日期啊,对应的日期,那下面这个里面日期怎么来,他查的是。你第三天我我都是按这个3月10号啊,这是3月10号操作,我查的是3月10号里面的get time所有的get。
13:02
3月10号里面所有的get。那你看啊,这是3月10号里面有3月8号的数据,3月9号开始领券的时间,还有3月10号领券。那我这么一查,这块能查出啥呢?他能查出来的。看看是不是他,你说你先看一点点看啊,先看这块儿能不能看懂。我这么一查,我就能把3月8号,3月9号,3月10号,因为我这个DT记住了哈,DT创建的时候是按照get time进行分区的,也就是说这个事件开始的时间。那我这里面领取获取出来的不就是三月八三月九三月十吗。啊,三月十好,那第一步OK吗?来先统计一下第一步O不OK,领取的是三月八,三月九,三月十,OK的敲个一,不OK的敲个二。你带点来啊,这是比较复杂的。
14:07
不OK,该敲二敲二啊,这个没事啊,没关系。行,那第一步OK哈,第一步我们先先往下来,也就说我们先获取第一步,也就是说我今天第三天新增和变化的数据,因为这里面只要有一个时间的话发生了变话,那我就会记录下来,那记录下来的话,我找到了三月八,三月九,三月十这么三个时间,那我这个y dt in。这个in我不知道大家还是否记得哈,In的含义呢,就是DT等于三月八,DT等于三月九,DT等于三月十。分别去查找。啊,这是这一个含义啊,比如说DT,那你看吧,如果DT等于三月八,也就说Y2D等于三月八,那这里面查询出来的数据是谁呢。那是历史的3月8号的数据,比如说get time是3月8号的数据。
15:02
对吧,因为它分区是。好,那么如果说我DT等于三月九,那它取出的就是3月9号get time。有的数据。那就把历史的get time的时间都拿出来了,三月八,三月九,好找出来之后干什么呢?哎,找之后再往后走,这是作为历史的啊,作为old,这是old,然后再往后。后边这一块看看他获取的是什么数据。这块这回查的是ods层K是不是用。那其实然后呢,操作时间DT呢,是这个3月10号啊,查的是3月10号的所有数据,也就是说查的是这张表当中所有的数据。3月10号嘛,3月10号这里面所有的数据。这是OD sods里的数据不存的它吗?记住啊,跟这个这个是不一样的,这是这个DWD层的DTDWDT呢是取决于这三个值,那我现在呢,是ods里面这个DT呢,就是3月10号。
16:05
那3月10号的所有数据都在这呢。哎,30号,因为这都有3月10号嘛。任何一个发生变化对吧,任何一个发生变化,它都会放到这个3月10号这个里面去。啊,这块是否理解,也就是说那现在就是你能发现这是3月10号新增加的数据。新增这样的数据,那我这块获取的是三月八三月九,所有是get time开始的时间,开始的这个分区的数据。两部数据。那这两个我要干什么呢?要进行一个负二的照引,其实就是一个负照引。那噪音的特点是什么?啊,副噪音的特点,你说左侧有的那就保留,右侧有的右侧保留啊,然后没有的就算补空对吧,这是负噪音的一个特点。那好。那现在再来捋一下,前面这块获取的是是不是它。
17:05
看一下我获取的3月8号对吧,开始时间是3月8号了,然后呢,我要获取这个3月9号,开始时间是3月9号的数据。对吧,这是左侧也是O的历史数据得到了。然后呢,右侧呢,这块呢,是今天新发生的数据,那新生的数据有哪些呢?看零号的这个。零号用户上一八,然后呢,下面56756785678对应的数据。啊,这两个数据。那这两个数据干什么呢?进行一个负out正义。那符号声音刚才说了。哎,没有的字段给你补空。啊,没有的志愿补控。这样不知道大家能不能理解啊,比如说左侧这是获取到事件开始时间的所有的历史分区,318的三月九的数据得出来,然后这个得出来,得出来之后呢,他们两个进行一个负二的招引。
18:07
啊,上面那个字段那个解释含义,再说那么它们两个一噪音的话,加上一个这句话,比如说前面取值的时候加上这么一句话。我先判断这个new里面有没有。如果你这里面为空。任何一个字段都是啊,这里面不光是这个时间,任何一个字段都是。那比如说这个字段为空,那我就取O的,那你看吧,比如说这几个这里面任何一个ID都是空的,那取谁呢?来取左侧的。相当于没有发生变化。对吧,啊,没有这应改,那如果说new不为空,那比如说这条它就不为空,对吧,3月10号它有新增的数据产生啊,那产生的话它取谁呢?取旧的,那它就会把这个给覆盖掉。啊覆盖掉,那再往下你看这个这个里面也是3月10号这个数据它不为空,那不为空就覆盖过去呗,我就取新的。
19:05
那最终你要达到这种效果,这种效果,这种效果。啊,稍微捋一下。如果新数据没有,就用旧的,否则的话就用新数据这样的一个覆盖。那到这儿的话,大家是否清楚啊,清楚的同学帮我扣个一。不清楚的扣个二。啊,不用隐瞒啊,这个实事求是啊,会的话就敲个一。嗯。有一些没敲,嗯,没敲也不知道会不会啊行,有那个军营没听懂啊,啊没关系啊,没没听没听懂正常啊,没听懂正常啊,这块呢,确实是比较难啊,我们再来啊,没听懂咱们就再再来一下啊,再细化一下啊嗯。
20:02
呃,来我们来看一下啊,还是这个优惠券领用这个事实啊,我们最终希望的是首先看希望的。期望的呢,是记录下来每个卷啊,被领用的开始时间。啊,每个券的开始时间,下单时间和支付时间。每产生一个它的变化,我就给它记录下来,你看这里面领取下单支付,只要产生变化就给它记录下来,但是呢,由于呢,历史的数据啊,它不好去修改。那不好去修改怎么办呢?哎,我只能修改它相应的全表。也是整个分区的数据全部覆盖。什么意思,你看啊,假如说第三天这里面我有发现了3月8号3月9号的,比如说领取的券。我这里面3月10号用了。那怎么办呢?你我就需要更新3月8号所有的分期数据,我需要更新3月9号所有分期数据。
21:01
我改不了你这一条,我就把整个全部改掉。就是这个思想。那我想覆盖你3月8号和3月9号所有分区的数据,那怎么覆盖?那你得先把3月8号和3月9号的所有数据找出来。那怎么找?哎,这么找,也就是说呃,Select查询这个分区里面get time。的所有的数据,那你这里面包含三一八三一九三一十。383934。都取出来了,那都取出来之后,那我就要查对应的三月八,三月九三月十这个数据。把里面所有的这个分区的数据得到,那怎么认为是这个分区的数据呢?因为我们在建表的时候都是用的get。对吧,啊都是get time,那你这里取出也是get time 3a8319310,那只要我这个DT在你这个get time里面是等于这个时间,那就说明是这天的数据。
22:03
那比如说啊,比如说select from这张表DT,我们现在就等于三月八。那我取出来的值不是这条吗?那我再来,那我这个DT等于39,那我取出来的不就这五条吗。对吧,那不管你这里面哈,假如说39有同学说,那你39这后面万一有别人给赋值了呢。比如说再来一个三月九,那跟我没关系,我只看的是get time,因为它只要get time是3月9号的,那它就是一个分区的数据。我就需要对这里面的所有数据进行一个更改,因为这一天里面有3月9号的数据发生了变化。这不3月9号事情发生变化吗?改一行改不了,改全改群表。好,那这个呢,我是把三月八三月九的时候这个数据取出来了,那有同学说你这还取出三月十了呢。对吧,肯定会有人疑问说你这还有三月十。但是注意我现在呢,是查刚查查这个。
23:00
我还没有创建3月10号分区吧,目前你没有任何看到我任何地方去创建3月10号的分区是没有创建的啊,没创建那它只有历史的分区,那历史的分区就只有38和39。是这样吗?哎,没有创建三月11会在哪,创建一会再说好,那三月八三月九,也就说把历史数据,就说你今天更新的数据当中涉及到的历史的分区,我全给它过滤出来,那假如说你历史这里面有同学说了,那我这历史里面还有3月7号呢。但是对不起,我第三天的时候没有3月7号的数据发生变化,那我就没有必要去覆盖3月7号的这个分区的数据。哎,就这么简单。啊。那来,那我三月八三月九取出来,取出来长啥样就长这样。对吧,只要他get是这个对应的分区的数据就长这样。啊张这样,那他取完之后,那下面我们要取今天所有的新增和变化的数据,哎,那其实就是这张全面这里的所有数据。
24:05
哎,那数据的话,那你就往这一放。对吧,这就是今天所有的数据。那我希望呢,把这两张表呢,进行一个整合,进行整合形成这个一个一一,嗯,这个一行当中包含我们所要的这个信息。那怎么整合呢?啊,你你任何一个,你要是不用这个副噪音的话,你任何一个噪音都有可能丢一部分数据。哎,那这种方式呢,就是副照音。负号那就是空位就补就补空就行了。啊,这个我相信大家应该没问题,复位补空,但是复位补空,那现在问题来了,我留左侧的数据还是留右侧的数据呢。对吧,我要旧的还是要新的呢?那从咱们的直观道理来说,肯定要留心的,但留心的有个问题啊,你这是副音。有可能我这里面这这这3月9号,你看这几个数据它没发生变化,那你要是给我装给我盖过来的话,那你我都给盖成那。
25:03
那你说我还不能取你这个,你说没变化还不能取那什么,哎,那在那个。生成的时候加上一个判断呢。加了一个判断,只要新的这里面它为空,那我就不取了,我就不变了,我就维持你这个O的原样。就OK了,好往下走,那最后呢,把它进行一个合并啊,一招音合并,比如说有新的取新的酶,新的流的。就会拼成这样。拼成这样还没完,拼成这样,这只是中间的一个临时表啊,记住了,这都是中间一个临时过程,你没有看到任何语句往里面去插,对吧,往里面插入数据,那到这块才插入数据。Table向这个目标表里面,也是这里面去插入数据。那这里面仍然是一个分区DT,那这个DT它是什么呢?它是一个钙的time。对吧,Get也就说是嗯,创领这个优惠券领取的时间。
26:02
那这个领取这个时间这一块,那我是写多少合适呢。有同学写三月十。啊写筛选十,那我把这里面都都插入到30里面去。你看同学就该说了,哎,你这里面你想啊,现在我拿到的是一张这张离子表的数据。我怎么把这些数据插入到历史的这张表里面去?我这是一张分期表。这就是个问题。哎,只需要啊,这个最后这个字段呢,采用动态分区的方式啊,我这里面是date,这个get time。啊,Get也说用它去作为分期支的就可以了。嗯,可以了,因为它这个get time呢,你看啊,如果你这里的数据是3月8号。啊盖,如果是3月8号的话,那我就相应的把这一条整个插回到三月八这张表里面去,如果你看你这里面获取的是3月9号,有3月9号的数据。我就把你们这里面整个3月9号的数据全部覆盖回这里面,比如说未来3月9号的数据,它会变成什么呢?变成这个。
27:11
未来3月9号的数据会覆盖到这3月8号的数据。会覆盖到这儿,然后3月10号的数据啊,3月10号。啊对,3月10号,3月10号会整个覆盖这里面的数据,形成这么三张分区表。啊,一个是覆盖一个啊全部覆盖。2月30号。不知道这个能不能理解啊,也就是说这个这个后面这个是一个动态分区啊,这个get呢,分别取3A83A9 3a10。那分别覆盖的历史的3月8号分区,3月9号分区和3月10号分区,那这个覆盖这个三月十的时候,比如这块覆盖的时候,他才会把这个3月10号的分区创建出来。啊,所以说开始的时候这块是没有的,只有这块往里面一插入,这个过程就会产生3月10号的分区。
28:00
啊,致使呢,整个才流程全部结束啊,流程全部结束。啊,那这块看大家能不能听懂啊,能听懂吗。听懂同学帮我扣个一。听不懂,扣个二。确实比较难啊。啊,军营听懂了哈,那还不错啊,挺好。嗯,行啊,确实这里面比较绕啊,比较绕,但是呢,我建议大家就是看图啊,我一般讲讲课的时候呢,情况画图啊,说实话这个这张图啊,我画了好久哈,画了好久,嗯,画了能有,哎呀,至少两三个小时吧。我就想着怎么怎么能给大家这个啊,画的懂一点啊,其实这里面完善了好几版,包括这个今天中午还稍微优化了一下,这样的话能让大家这个尽可能的这个呃,理解透彻啊,到位。没有图的话是真的是很难懂啊,这个呢是那那好一点。
29:03
行啊,那这个呢,后面呢,大家呢,一会儿呢,给大家点时间啊,稍微理解一下应该就会好一些啊,照着图去理解啊,照着图,那下面我们来真正的这个实操一下。
我来说两句