00:00
好,那接下来呢,我们来讲一下自定义UDTF函数解析具体的事件字段啊,那解析这个事件字段呢,是基于上面那个udf,把原来那个杰森已经一个初步的解析之后,然后用它去解析,好那我们下面来看一下。那这个呢,本身是整个这个接身对象,那这个接身对象当中剩下这一块我们还没有对它进行处理,那这块怎么处理呢?我们就用到了一个列函数。啊,这个是letter view啊,然后这个呢,是我们自定义的炸略函数的名称,你们以前用的是一个pro是吧?啊lo好,然后传进去具体的内容,那我这块传的是它啊整个这个金日数组啊接数组,然后后面定一个名师的名称,然后AS2个字段啊,分别对应的事件,这个事件名称和事件内容啊这两个字段。
01:11
比如说未来函数是长这样,那这个呢,是自定义的函数。啊,GF其他都是标准格式对吧?啊,那下面呢,就来测定一下这个udtf啊,那它需要继承这样在uddf从前里边三个方法分别是初始化关闭和process,比如说业务处理这么三个,那么来看一下,首先需要在这个初始化函数里面做两件事。啊,做什么呢?这里面需要指定输出参数的名称和参数的类型,于是我们要指定name一个。啊就没了,那这两个就是在这个初始化当中去做,那通过一个工厂类啊,然后获取标准的这种数据格式啊,按照它原格格式去做就行了,那这里面设置名称设置类型,设置名称设置类型。
02:13
啊,就OK了啊,那是处置化准备,那接下来呢,Close close在里面我没做任何事情啊,不用管它,之后来到了process这方化当中。那这个方法当中呢,是输入一条记录,就要输出若干条结果,那这个呢,也就是一进多出啊,一进多出啊,那这个方法名称里面有一个参数就叫object数组,那如果是多进多出的话。那这里面你就能取出多个值啊,其实本身它是支持多进多出的,只不过我们这里面是一进多出啊好,那往下看。那首先进来之后就用这个object数组取出第零个值,因为它是一进多出,所以第零二是不就是传进来的一个数据啊,那传来数据是谁呢?ED啊,就是这个ED,其实因为这个ED就等于这个OS,这个OPS是后面我们解析完的一个制造名称,哈啊,它就代表了这里的内容,记住啊,这是数中。
03:25
好,然后把它变成实例,返回一个input啊,这是个实质类型,然后呢,对它进行一个办公处理校验啊,这比他说的之后往下走,校验完成之后,这里面又了一个金森额瑞啊,就把它传出来金额瑞,因为它本身就是一个。接身数组,那我就用一个大,然后就得到了这个接身数组的对象。那这一块我就循环便利这个进数数,这些数就能取出一个一个的进对象。
04:03
对吧,那比如说我取出来第一个针对项是它。这不循环定律吗?那循环变率通过这一个对象里面,我要取出两个值分别是它的。事件名称和事件整体。啊,你实现内容。啊,那这里面事件名称怎么获取啊,获取它,那你既然你都已经获取到这个数组对象了,通过它获取到这个值,然后get string传进去P就能得到对应的外流。那下一个。下一个呢,是要获取整个事件的整体,那其实就是这个数组当中的这一个对象。啊,这个也是这一个整体。啊,都能拿到啊,记住哈,这一块我还没有一个一个的去拆这个字段,不用着急去拆它,什么时候去拆它呢?这个中间表建完之后。
05:02
他就是一个健身对象,我要想取出这里的值用什么。是不是就能拿到了啊,就这么简单,所以说这块不用着急拆拆它啊,我就拿它整体就行了。当然你这块如果就想拿这一块,其实也是没有问题的。啊,拿出来之后,那我再解析就OK哈,行,那我们先不拿,先拿它整体过来,然后后面还剩一个这一块要forward写出去。这也有点类似于什么呢?Map当中的contest.right因为map当中一次进来一组P,对吧?啊,进来一组数据格,进来一个数据格,那这里面也是你进来一个事件,算完了就写出去,再进来一个,再算完了再写出去。啊,那最终出来的结果就是对应的事件名称,事件内容,事件名称事件内容。
06:07
啊,就把它完全炸裂开了啊,就这么一个功能哈,好,那下面呢,我们来自己去实现一下这个功能。那继续定义一个包名udtf。报名啊,有了这报名之后,然后呢,再创建一下它的类名。然后开始写代码啊,定一个类继承JAUDTF啊它然后重写里面三个方法。来这啊,这就实现啊,当个热呢,给你实现两个,那然后进去二反勾键进来。
07:02
进来之后找到这有一个啊,这有一个过时的啊,那也不耽误用啊,拿过来。初始化方法啊,那拿它之后,这里面上面它的日常异常啊,给它删掉,在这里面啊,它做两件事,一个是定义返回值的名称,另一个是返回值的类型啊,那这里面首先object OB。Inter。Factory啊,工厂类相当于工厂的设计模式啊,创建对象第2GET standard啊第一个。这么长,然后呢,这里面呢,有两个值,你看一下啊,这边有两个值分别呢,是两个及格,那你不用管,管它是啥呢,先来一个fair的。
08:00
内斯啊,第一个是名称,第二个呢是fids。看类型啊,类型OK,创建两个名称之后二加回称创建。这个对应需要的结果又一个list,好,那我这还需要一个类型阿尔加声创建另一个A这个,那这样呢,就把这两个及格创建完成了,创建完成之后向这里面分别去复值啊先赋值内。然后它点艾艾,那我们是一杯液1万的内内。好,那接下来就设置一下这个event的类型点。那这里面的类型呢,是。
09:02
PRIM。啊,Bring me TV啊,Object intercept factory啊,这么一个工厂类,通过它点这个不太好记哈,啊,但是你得一定记,那这里面有几个类型的看,首先呢,这是有一个实质类型,你再往下布尔类型字节字节。Double float有很多类型,那我们选哪一个呢?使劲啊,以往定义even name和even就是使劲,OK。定完了,然后下一个。Fair names.even然后fires there either there,还是实质类型啊,这样呢,就是定义这个输出。变量的名称和类型我们就搞定了,传达之后,下面我们再来处理具体的process业务,那这个业务当中,哎,就是object数组,那我们既然是一进多出,那这块就简单了。
10:18
我就求出理好,那你就取出第一个值,那它就是传进来的值。第二不使。分开了。那传进来呢,我要对它进行一个校验啊E。使劲。有点事。第二,Is black,如果他没空。直接你看。啊,Return,因为它的返回值啊是Y的,相当于是直接就结束本次处理哈,啊return。
11:04
如果能通过校验的话,那我就可以对他进行进一步的一个处理了,那怎么处理呢?又一个接身而。对。啊接那传进去的就是input啊,因为它本身它就是一个啊。下。二加下看一下。好,那这样呢,就拿到了这个金瑞。拿到了这个我要判一下啊,它是否为一价。啊好大老师,那向下再处理啊,那我们来看一下这张图,现在走到哪了,现在呢,相当于走到这位。
12:02
也就是说我们传进去的是一个ET,也就说四件数组啊,然后这里面取出这个事件数组的值啊,判断它是否为空,空的话直接返回了,如果有值的话,我用了一个杰森和瑞,因为它本身就是一个金瑞,然后如果为空返回,那下面这块就是循环便利这个这是瑞。然后把它值一组一组的写出去,类似于,其实就相当于点right当中。再来,来这。他老公。循环命令。负2Y,那这里面就是这点,但它的长度,那这里面每一次呢,都需要返回一个string数组,记住这块别找错包了,一定要别找错包了啊,是这个啊啊。
13:03
然后呢,是书主啊。好,那这个呢是re。Re,这是返回的结果,那返回的结果里面包含两个值,一个是。名称。另一个是。节省对吧,啊具体的数据那好,那这里面第一个它的名称怎么获取呢。价通过它第2GET上干什么,Jas盖啊I取出第一个对象,就第二个对象对吧,然后第二个对象当中的我要取什么。名称是吧,啊,那就是get使均具体的值了,那具体的这个K的值它叫。夜大啊,成之业。
14:02
En,那这样呢,就把这个事件的名称提出来了,记住只要是涉及到取值的时候都是实际啊,涉及到再下一步往下走的,那你看下一步是什么啊,那就是具体的是该怎么这还干什么啊这的re ES。等于11,那一的话就是具体获取这个事件的值,那这里面就是价点get时间哎。就是D对象。是这样吗?所以说记住一点啊,到最后值的时候都是get的,实际直接拿出它对应的值啊,那这块这两个值拿到之后,那下面就要在这里面往出写forward啊,Forward日照。啊,写出去。啊,那这里面呢,这一块呢,是容易抛出异常啊,有异常有一些异常,比如说突然间啊,哪个数据呢,获取不到值了,那那异常呢,有可能就崩溃了,那崩溃这块呢,你要这个友好一点的,可以把它串起来。
15:15
那如果发生异常,我就肯定有啊,继续下一次循环,比如说下一组数据继续写啊,不要把这个循环停止掉啊,是这个意思啊好,那这就是for,那这里面呢,就是这个自定义UDTF函数。啊,那我们稍微回顾一下啊,再回顾一下好,首先呢,是第一个类继承占略的一个UDTF,那这里面呢,有三个方法,分别是处置化process,还有一个close方法。那这个初始化里面只需要做两件事啊,定义输出值的名称和类型啊名称和类型OK,那下面这块呢,就是具体的这个process的处理,那这里面呢,它是一进多出,那我就只取D形式,如果是二进二出呢。
16:08
我是不是取出第一个,然后再取一个是一啊,那是不是两个实数参数就得到了吧?啊这样啊,这要注意啊,那既然是一进多一进多出进来,当进来之后对它进行一个校验啊,如果脱靶,那我们它本身就是一个杰森瑞,那我就用一个杰瑞。那对它进行一个喷口处理,下面这一块一整块都是。一整块儿。好使了啊,这一整块都是来循环便力接身arra里面的值,然后一个一个的往里面去封装,分别获取事件的名称以及事件的内容啊好,然后写出去啊,这么一个过程啊,行。那这个完事之后,我们对这个工程打包。
17:20
这个第一次打的时候可能要连一下网啊,下载一些包啊下载了。也不是很难啊,不是很难。那这个要是打完之后,接下来呢,我们就要把这个函数添加到这个have里面去,那添加到have里面分成两类函数,一类是临时函数。那一类是永久函数。好,那这边呢,是编译成功了,编译成功之后进到这里面来。
18:06
现在这里面呢,同样是有依赖的和没依赖的,那我们用哪一个。有依赖的还是没依赖的依赖没依赖的,因为我们这个里面po文件里面只有一个have对吧,而且我们集群上还有,那就无所谓了。那这个库中。啊,加BCDD帽子还有。那啊,把它传到那个have,呃,不要包销,就have包下就行了。这个你发在哪都行,因为日后是我们是爱的时候,跟他路径匹配上就行了。对,它是阴天的,那这里面我就给它放到这个包下到这好,那它添加完之后,那下来的事就是要添加一个临时函数啊,添加临函数,那添加临时函数呢,首先呢,要艾价大下也说把这个临时函数添加到这个出场里面去啊。
19:14
让他知道他在什么位置。本身启动的比较慢一些啊。你们还起得骂吗?还行啊。好搞定之后添加这个一次函数加包啊,那这个呢,就是添加进去了,添加进去之后下面呢,我们就要创建两个临时函数,那临时函数呢,就是在这个create function啊中间加了一个temp temp是吧?啊临时的含义,然后呢,这个呢是函数的名称是不是一起的啊这齐的,然后呢,后面是全类名啊,全类零,然后CRA0函数啊这个呢是UDT的函数,后边全列零啊这两个然后来进行运行。
20:37
那如果是角函数呢,就把它去掉了,对,嗯,直径。好,创建成功,那这样的这两个临时函数我们也创建成功了,那下面的话,我们就要用到刚才创建的两个零函数,把数据导入到这张中间表里面去。
21:03
把哪张表里的数据导回来呢?就是ODS里面的even的LA里面就一个line字段,把这张表里的数据导入到刚才我们创建的这个base表里面,只不过在导入的过程当中用到了自定义udf和UDTF。啊,这么一个过程,好,那我们稍微回顾一下啊。啊,这是我们的目标表。原始点ods。100呢?In love里面就一个字段,然后呢,像这张表里面去导入数据,那这张表里的数据呢,是前面是公共字段。然后中间这块一定。杰森。
22:01
然后射会太。是这样的啊,这样一个过程,那下面就是把这里的数据导入到这里面去,那这里面还有UDF和TF。啊,这么多东西,那来吧。下表里插入数据啊,N ER in over。啊,对边像这张表里面查出数据,那像这张表里的哪地方出数据呢?PR。问part,那part是DG等于。2019杠零二杠。幺零这样比较强,那这张表的数据来于哪呢?From from。
23:00
这两点。对吧,是这样一个过程的啊,这样一个过程,好,那我既然往这张表里面插入字段,那我查询的字段就得包含这些吧,啊这边这些好,那这是段在哪呢。这事是吧?啊,这是公共之道。然后下面呢,是even name even time。啊。拿回来。公式态啊,以及这些内容都有了,那有了这些内容之后,后面。那后面我怎么获取这些值呢?那获取这些值这个过程就是要对这里面刚才说的它再进行一个查询了,你说只查询对吧?嗯,只查询,那这里面是内容嘛。
24:03
只要把它打开。查询,那这张表呢,就是通过只查询去查这张表。那查的话就包含。Select,查E,然后from。张点。大体上是这么一个结构吧,啊对这么一个结构,那好,那你在拉的时候。怎么能获取这些字段呢?那首先一步一步来公共字段。我是用到了udf udf,那udf怎么把这些正态获取呢?嗯,来我们来看一下。这里面也很巧妙,首先我们的公共字段的解析函数是best and,一个解析,然后传进来的是刚才ods表当中的唯一字段line。
25:05
然后同时把公共字段的所有的key。穿起来。对吧,那这一块得出的结果就是。公共阶段,下面是时间阶段,然后复习时间是这样吗?啊,然后前面又加了一个力的切割,用杠T切割。那切割完之后的。我们来看啊,把这块我们可以给大家运行一下,把这个udf来到这。毕竟。稍微回顾一下啊。那这块你看我们运行完了,那也就是说现在呢是这样。我把这个line传到这个自定义函数里面去啊,传进去这个P值,那前半部分这些我就都已经解析出来了。
26:06
解析出来之后,我再对这个数据进行用杠铁切割对吧,那切割出来一个两个层这么多值,那切割完的值我的零号。那就是对应着mid的值。你看我这里面是不是m mid地流号是不是mid,哎,就这么一个过程,跟你传进去的地值的顺序有关系。那好,那我们这个公共的这个字段,它有多少个呢?往下找零一一直往下啊OS还这是多少呢,一直到gmail。APP经纬度是不是到这儿了。比如说到这一块,17个个17个公共字段,我们就都获取出来了,那剩下的内容是。
27:01
Name。服务器事件对吧?啊,那这里面内就对应的是。啊,不是一个内网,是这个杰森就对应的OPS一个整体,那这个OPS其实就是这里面的。好。对,就是ET就从这开始啊,啊就这一块,这就是ET,那这里面呢,包含了N多个事件,我对它再一步的解析啊好,那我们把这块拿过来啊,也就是说通过这个公共制段。啊,然后解析。得出来这么多值。放在这里面太长了啊,特别长。OK,那工程知道我们就拿到了。
28:00
拿到之后,这事儿还没完。好,然后条件where d。DT等于这个是2019杠零二杠102月三号。啊,然后还有条件啊,还有一个什么条件呢?还有一个是被它在解析过程当中,它得不等于空。因为我们在解析过程当中,如果失败的话,是不是就返回一个空啊。啊,那这块所以说加上这么一个东西,你可以看在我们在这个解析过程当中。返回值。对吧,啊,如果失败的话就是法控啊,那所以这块要注意哈。啊,那把这一块加上。条件。这个按的。
29:01
不能打炮。啊,不能等于空之后,那么下面这边再处理就OK了,那还没完,那现在呢,只是把公共字段的前17个解决了,那下面呢,还有三个字段,这三个字段。那这三个字段你还需要对它的OS和servetime进行解析,Time很简单,直接可以过来,那么这个OPS你要炸裂开成两个,是这样吗?啊,要它进行炸裂,那炸裂的话,我们还制定了一个UD撇uddf的名称叫它。啊,那传进去的就是OPS,也就是说这块把它传去。传进来就炸裂排成和杰森那之后由上边的17个字段,再拼上这两个字段啊,以及这个shift态,就把上面这些值就都填满了。
30:04
啊,就这么获取了哈,好,那下面呢,这块呢,就是这个炸裂函数。OK,也就是在这把它进一步的一个展开,好,那我们稍微回顾一下。首先呢,我们要向这个中间表里面插入数据,那这张中间表呢,它的字段包括公共字段,事件名称,事件内容和so态,那原始的odf上就一个字段Y啊,它要往这里面去添加,那这里面提前我们准备好了两个函数udf和uddf,一个负责公共字段的解析,一个负责事件字段的解析啊,比如大时候像这里面去插。那他的话,我先准备好公布这段,然后事件名称,事件内容是不是他,那之后他怎么来的,通过只查询先去查询。Odslo这里面。
31:00
啊,那这里面呢,它只有一个字段那。作为公共字段的一个解析啊,传进去,然后同时传进去,公共字段的K是我的K,通过S1切割就得出一个一个对应的值,能得到到这儿。那就把公共执照全部获取到了。然后剩下的事儿呢,就是这个世界字段和服务器名称那这一块。就是处理事件之段,它的处理服气时间,这个直接都对过来。好,那再往下呢,这一块就是把这个OPS炸裂成两个字段啊,一内和一的介绍啊就OK了啊好,那我们来执行一下。像那个中间表当中去找一些数据啊。
32:06
相对来说比较复杂一些。他并没有一步到位,只是导入到中间的过程啊,剩下的话我们再通过这张表再对它进行一个解析哈,就复杂问题先简单化处理。那在这个过程当中啊,其实有些面试官会好了哈,会问啊,说你这里面不用udf自定义udf和UDTF能不能解析呢。其实是能的,尤其那个udf,我们用盖的接身是不是也可以取出一个一个的这个值啊,啊没有问题,那为什么还要用这个udf呢?稍等,其实是涉及到如果说你这个udf解析过程当中有一些数据错了。我是不是可以把它打印到我们想要的这个文件里面去,可以方便定位了,那如果是系统的函数,你是没法定位的啊,这就方便我们去一些这个自定义哈,去呃定位吧,好,那这里面导入进去之后查一下slide from。
33:16
那这个表名是啥?好一米呢。那这样的这个数据你看就已经解析开来了,只不过是这一块还没有完全解开,它带着的是事件名称和事件的内容。事件名称事件的内容就是。对吧,啊,那有了事件名称和事件内容,那后面的事就用get介身和get直接就解析完了,对吧?啊,因为我知道它是哪个事件的,所以说我这个盖的健身传进去的这个P啊,也跟这个事件类型是对应的啊好,那这个呢,就是。
34:01
解析事件值的明细表。
我来说两句