00:00
好,那接下来我们看这张时表的数据装载啊,那这张表的装载逻辑跟我们讲的第一个累积型快照时表的逻辑其实是相同的,那所以咱们有了第一张时表的基础啊,那我们再去写这个表的装载circle,那其实就比较容易了啊好,那现在我们先分析一下它装载时的数据走向啊,我们点开这个PPT。好,那上边指代的内容就是ODI层的与支付相关的业务表啊,那它就是我们支付表的数据来源,对吧?那下边呢,就是支付实施表啊好,那现在假定我们的日期是2020年6月14号,看一下我们第一天能拿到什么数据。OK,那拿到的是不是全量的支付记录啊,对吧?那当然咱们拿到全量的支付记录之后呢,我们要分析一下啊,这里边儿是不是可能有完成的支付记录,也可能有未完成的支付记录啊,对吧?那完成的记录呢,哪天完成的就要放到哪天的分区里,未完成的记录呢,要放到9999分区,对吧?所以第一天我们要做的就是动态分区。没错吧,那OK,那随着时间的推移,我们来到了第二天,那从第二天开始,我们能够从ods层获取到的数据是不是就是新增变化的记录了呀,对吧?那新增及变化的记录里边我们还是再来分析一下啊,那这里边我们有新增有变化对吧?那先分析新增,那新增的记录里边是不是可能包含完成的记录,也可能包含未完成的记录。
01:21
没错吧,那所以说这部分数据呢,可能要写到999分区,也可能要写到完成的分区里,那接下来我们再看这个变化啊,变化的记录指的是什么呀?是不是指的是原来产生的记录在今天发生了变化呀,对吧?啊OK,那你想一想啊,今天发生变化的记录肯定是什么样的,肯定是原来未完成的记录。对吧,为啥?因为完成的记录是不会再发生变化了,没错吧,那我们原来未完成的记录在哪,是不是在9999分区里放着,也就是说9999分区里的数据在今天是不是可能会发生变化呀,对吧?那发生变化之后,那是不是有可能会完成,没错吧,那完成我就得把它从9999分区里边拿出来,然后写到完成的分区里,没错吧?那所以说我们每日装载的时候,它的数据走向,诶就是这样的啊OK,那后续每天都是相同的这个走向。
02:10
啊好,那这就是支付时表的数据装载时的,哎,这个走向。好,那接下来我们就开始编写这张表的数据装载语句啊,好,我们打开date吧,那同样在这儿呢,也会分为首日和每日装载啊,我们现在先看首日啊,那假定今天日期就是6月14号啊,那咱们先来明确啊,往这张表当中装载数据时,我们主要的数据来源是哪张表?啊,那是不是应该是ods层的payment啊,对吧,Ods payment,那当然我们需要获取它6月14号这一个分区啊,2020杠零六杠幺。啊,好,那现在我们需要拿哪些字段呢?啊,在这儿呢,我们还是先尝试着获取全部的字段啊,拿这个字段呢,需要处理一下,诶,我在这儿呢,已经提前处理好了啊,咱给它拿过来,CTRLC来放到这个位置CTRLV啊来我们格式化一下啊来大家注意观察啊,这里边咱是不是只有一个字段拿不到啊,就是provice ID,那proce ID应该从哪张表来,是不肯定是older这张表啊,对吧呀,那所以说在下边我们再写一个select查询sed from应该是哪张表ods层的o in对吧?那当然分区呢也是哎,2020杠零六杠幺四啊好,那这里边我们只需要拿俩字段就行了,一个是ID,那还有一个呢是provice ID啊province ID行,那上面这个proce ID咱就可以去掉了啊,那接下来我们要做的工作呢,就是将这两个子查询给它转起来对吧?啊好,那现在我们先给它们分别起一个别名。
03:44
来,那第一个子查询,我们起名为PI啊,P payment in啊,好,那现在CTRLX,我们把第二一个也起一个名,第二个呢,我们起名为OI啊。好,那他俩要做的呢,哎,就是一个关联,那在这咱们用什么关联呀?哎,用left对吧,Left就可以这啊in好,那下边我们写下连接条件,这个应该是PI点,呃,OID对吧?啊OID应该等于啊o i.ID啊没错吧,那现在我们从里边选择咱所需的所有字段,Select,诶,然后from,呃,然后呢,我们再去拿一下这个所有的字段啊CTRLC拿过来,诶,放在这个位置。
04:25
好,那现在我们就能拿到所有的字段了,当然这个ID呢,它在这呢是有歧异的,对吧?我们需要写一个诶别名那pi.id啊,好,那现在我们就已经拿到了所有的数据了啊,那接下来我们要做的事呢,就是将这部分数据insert到咱的目标表对吧?那insert right table应该是dwd payment in for对吧?别忘了后边需要写一个分区啊,Partition,那由于我们是手入装载,需要用到动态分区,所以在这儿呢,只写一个DT就可以了啊,然后分区做的值,咱们需要在额外的多select一个字段对吧?那这个值咱应该怎么写呢?
05:00
啊,分析一下这里边的逻辑啊,咱现在拿到的是全部的,诶支付记录对吧,里边有完成的有未完成的,完成的放到完成的,诶这一天的分区里就可以了,对吧,未完成的放到9999。那对于支付来说,什么是完成啊?啊,那在这儿这么去理解就可以有回调,我们就认为它是支付完成了啊,没错吧,那所以在这儿呢,我们的完成时间就可以用谁啊,就可以用call backtime毁掉时间啊,所以说那现在我们要做的事呢,就是呃,做一个判断啊,判断啥呀,判断backtime是否为空,如果不为空啊,那就把数据写到call back time对应日期的分区当中啊,那否则的话呢,我们就把数据写到9999分区里啊这个逻辑要简单一点,所以在这呢,直接使用NV就可以了啊,那当然咱们日期需要进行格式化的处理,那我们把call back time放进来,然后呢,给它格式化成啊,年月日的形式。好,那完了之后呢,后边再放一个9999。杠九九杠九九啊OK,那现在咱这个动态分区字段的值就算是写好了啊,我们这个首日装载的搜索语句也就写完了,那紧接着我们来看一下它的每日装载啊来我们往下翻啊,那假定现在的日期呢,就是6月15号了啊,那我们每日装载的逻辑应该是什么样的呢?
06:18
那其实所有的累积型快照时表,它的每日装载的逻辑都是相同的啊,那所以说我们前面已经讲过一张累计型快照时表了,对吧?咱们已经有基础了,那所以说这张表对大家来说应该就不是那么的难了啊好,那接下来我们具体分析一下那它的诶每日装载的思路啊,那首先我们需要先拿到这张表的原来的9999分区的数据,对吧?那这里边存放的是什么?是截止到前一日的哎,所有的未完成的支付记录,没错吧?那接下来呢,我们还需要拿到ODI层的业务表的新增变化的数据,没错吧?那OK,那这两部分数据呢,需要做一个全外联啊,那全外联之后呢,它会形成一个虚表对吧?啊,那这里边呢,会有一些诶地方自动补上no值啊,比如说这两个地方对吧,那我们要做的就是啥呀?啊,从这个虚表当中获取这些记所有记录的最新状态,那其实就是哪部分数据,是不是就是这一部分数据,再加上这一部分数据。
07:17
啊,没错吧,啊,那拿到这两部分数据之后呢,我们需要怎么做呀,我们需要把这部分数据呢,Insert overri,原来的这个支付实时表当中啊,那咱们把最新的状态给它insert all right回去,那是不是就相当会把原来的状态给覆盖掉啊,对吧?那这样一来我们实际上就完成了一个修改的操作啊,是这样的啊好,那当然大家都知道啊,我们拿到的这部分数据啊,它实际上里边可能会包含完成的,也可能会包含未完成的。对吧,那所以说我们在往回进行ins的or RA操作的时候呢,我们可能要往多个分区里边写数据,对吧,那所以最后呢,咱这需要用到一个动态分区的操作。好,那思路咱们分析完了啊,那接下来我们就开始编写这个circle,那首先我们需要先获取咱所需的两部分数据啊,那一部分呢,应该是来自于DWD层的payment in for的9995分区对吧?1WRE v 2dT,诶,等于9999杠九九杠九九啊OK,那在这儿呢,我们需要拿到它所有的字段啊,CTRLC啊拿一下来CTRLV好了,那这就是我们的第一部分数据,像这部分数据呢,就是咱那个所谓的O的子查询对吧?来,咱们现在呢,就给它把这个别名起出来啊来往前对一下,那这个呢,就是old。
08:32
好,那接下来我们继续啊,那接下来咱再获取那个new这部分数据,对吧?那OK new主要来自于哪儿啊,主要是不是来自于ODI层的payment的一份啊,对吧?啊,OK,那咱们哪个分区应该是2020杠零六杠幺五这个分区对吧?啊幺五啊好,那现在我们也把所有的字段呢,诶都给它拿一下来,CTRLC,好拿到data group当中来,CTRLV啊好,大家注意啊,那咱这同样是拿不到这个pro ID的,对吧?那需要从哪去拿呀?是不是又得跟order info进行关联呀,对吧?那select一下,那from olders层的older in for,那哪个分区呢?
09:09
2020杠零六杠,诶幺五啊好,那在这儿呢,我们只需要拿一个ID,还有一个province ID就够了啊好,那现在我们要做的事呢,就是把这两个子查询撞到一起,然后呢,组成咱们那个new的子查询,对吧?啊OK,那现在咱们操作一下,那这个呢,CTRLS先放到括号里。CTRLV,呃,这个呢,我起别名为呃,PI啊,也就是pay in,那下面呢,就是OA啊,CTRLX。来往前对一下,那这个是OI好,那他俩呢,需要做一个left draw啊R啊go。好,那下边的关联条件呢,应该是呃,PI点啊O的ID等于等于啥呀,等于oi.id没错吧,那接下来我们再从这里边去选择咱们所需的所有字段select from,然后呢,把这个字段拿过来,CTRLV啊,不是这个啊,咱们去拿一下啊,应该在这CTRLC。
10:05
拿过来,拿来之后呢,放在这儿啊好了,那这个位置呢,ID它其实有问题的对吧?ID呢,我们需要给它加一个别名对吧,应该是PI才行啊好,那现在我们就拿到了咱们这个所谓的new了,对吧?好,那现在我们给它括起来,然后起一个别名啊来操作一下。CTRLX。哎,CTRLV,好,那这就是所谓的new对吧?那接下来我们要做的操作啊,其实就很简单了,我们要做的是啥呀?是不是让这个new和old的进行全外连压对吧?那接下来我们操作一下应该是负al John对吧?那接下来呢,我们来一个啊。放什么?应该是on old.id等于new.id对吧?啊,好,那这个关联上之后,我们就可以从这两个子查询的序表当中,哎,去获取咱们所需的结果了,那select from,那当然我们选择的时候呢,应该选择什么?应该选择这些所有记录的最新状态对吧?那具体具体是哪两部分呀,是不是具体是这一部分再加上这部分呀,对吧?那咱们怎么取呢?还是那个逻辑啊,什么逻辑?如果new为no,那我们就选O的,如果new不为now,那就选new,对吧?也就是NVL这个操作对不对?那在这呢,我们就不再一个一个写了,我们去拿一下文档当中的结果啊,哎,咱们获取一下,找到这个支付时表,OK,那这就是我们所需的那几个NVL。
11:25
好,那接下来呢,我给它放在这个位置啊,好了,那这就是我们拿到的,诶,所有记录的最新状态,没错吧?那接下来大家要干啥呀?是不是又要把数据通过动态分区写到咱们这个目标表当中啊,对吧?Inser的all right加一个table,应该是dwd payment in,那后边呢,Part我们只写这,只写DT就够了,没错吧?那至于这个动态分区字段的值应该怎么写呀?其实跟我们首日装载的时候啊,它这个逻辑是相同的,CTRLC咱可以拿一下啊,只不过呢,诶,我们需要把这里边的值改一下啊,咱们应该改成啥呀?是不是应该改成NVL之后的结果,也就是说我们需要拿到这个最新的这个call back time对不对?那CTRLV,诶,拿过来就可以了啊好,那这就是我们每日装载的,呃,这个SQL语句。
我来说两句