00:00
那首先呢,创建一个报名UDTF。在这里。他可以好,那这个类名啊,我就跟它一致了哈,省得后面我们还得改这个文档啊,叫even杰uf。拿回来。好,那下面怎么写呢?第一个类继承generic哈,Gene。嗯,G啊对,呃,GR在那一个udtf这个包下的啊,定义一个类继承它。那这里面要实现它三个方法啊,Out加回车,它给你提示的是两个,一个是process,一个是close啊,你还要加上一个初始化的哈,说的OK。那这样结束,结束之后另一个方法怎么找呢?按住CTRL键点进去,点进去之后啊,这里面找,呃,其实有两个方法,一个叫啊这一个。
01:04
你看这个下面这个呢,是已经过时的对吧?啊叫过时的in Internet,那上面这个呢,是一个正常的啊,没过时的哈,属于这个新的,那新的的话主要在这个参数这个差别上,这里面叫TCT object,呃,Inceptor,这里面呢是一个object incept数主啊,区别不大,我们拿这个最新的吧,啊拿最新的。啊,拿过来往这一放,这就可以啊,往这一放就可以了。真的。嗯,那这里面的东西啊,通通都删掉啊。这个也删掉。行,那在这里面要实现什么逻辑呢?要干这么几件事。呃,定义UDTF。UDTF返回值,返回值的类型和冰称啊这么两块,那怎么定义呢?哎,你看哈,它需要一个这个tru object intercepts啊,Intercept,那我就给他一个,那怎么给呢?哎,可以通过这个类一个工厂类去给他叫OB object啊intercept in s。
02:23
通过它通过这个工厂类去获取。它点二叫get standardtru ABS in the sector也是第一个啊,就是它哈,请看那这里面呢,它需要输入的诶,没接上啊,CTRL加T提示一下。它需要输入这么几个值啊,我用上面这一行啊,输入两个值,一个呢,其实就是它返回值的一个名称,另一个呢,是返回值类型的一个校验。也就说一个是定义返回值的,约束返回值的,一个是约束返回值啊,这个类型的叫smart field,那这块呢,就好起了,你需要一个fieldd file name,你后面呢,需要一个啊,其实我可以写成一个type,其实是一个类型啊,这里面其实一个检查叫检查员啊,其实是一个约束哈,约束,约束他的名称,约束它的类型。
03:17
那你需要两个,那就给他两个呗,二加回撤啊,我写代码的特点就是你需要啥你就给啥另一个啊,需要一个集合对吧?啊,它是一个集合,那给一个。A gra好,完事了,你需要它就给一个它,那你后面呢,还需要一个这个类型out加回车,那就再给一个又一个A2元不是意思结束了。你说这两个空的集合,我已经提前创建好了,那创建好了我下面就开始赋值了哈,要向这里面赋值对应的名称。第二爱就行啊,往集合里面添加,比如说我们添加一个e event。这就是我们未来定义的udtf这个函数,它返回值的其中的一个名称。
04:06
它就是译文的name。啊E以后呢,就可以直接用它了啊,就这么简单好搞定,那之后呢,它是这个顺序写的哈,你再想加下一个这个返回值,那还是I的Eve,我们叫杰森啊,这个名字可以随便起,但最好呢建名E。比如说我定义两个返回值啊,分别名称是even name和even阶层,那么对于这两个返回值它的类型有没有什么约束呢?啊有,那靠什么约束,靠它约束点仍然是I的啊ID,那ID的话,这里面有一个PM。这叫啊,Primitive object in intercept factory啊,通过它又是一个工厂类。然后第二。这里面叫Java,你看啊,Java string in the center,如果你强制这个上面第一个哈,因为它是顺序的,你说这个。
05:04
这个集合跟这个集格它的顺序必须一致,也就说它这个name对应着这个类型,下面接对应着下一个。啊,这个顺序一定要注意哈,行,那因为那内内要求的什么类型呢,我们希望它是实质类型,你说必须是实质类型,不实类型的话,那不行。啊,那你就加上一个Java string object,你得检查检查它是否是知识类型,那就是Java。时间我上。OK,搞定啊,然后再来一个fire type点,比如说下面你对这个even杰森他的类型你又是怎么判断的呢?哎,仍然是primary factory,第二叫,那如果你定义的是其他类型,那你下面个有布类型啊,有什么be书主啊,Be right。啊,应该还有什么flow有double啊,其他类型也都有,还有什么了,对吧?啊,那我当然我们这里面选择的是这个使。就OK了啊这么简单,一个是返回值的名称,一个是返回值的类型。
06:04
好,那这块结束之后,那下面我们来写具体的这个业务逻辑。那这个业务逻辑呢,它传进来的是一个数组啊,比如说传入,但是。杰森啊,杰森瑞啊,你要知道这个事。那这个介绍位怎么来的?这个介绍瑞是通过这个自定义udf里面传入。传入ET啊,对吧,啊,传入ET取出来的,那这个后面我们在用到用的时候呢,我给大家再说好,那你既然传进来的是一个接和瑞,那他拿过来。那我这。零啊取出零,那零的话,这里面我要把它变成这个实际类型啊,因为它默认的是一个类型,我们知道它是string对吧?接身瑞嘛,啊知道这个,所以说可以把它强转,强转的话就是input输入的,这那对这个输入值呢,进行合法性校验。
07:13
啊,拖把经啊,衣服。呃,Input合法校验用这个。SS。There is black把input传进来。如果它为空。那你就别干了,啥也别干了,直接return吧,对吧,哎,直接return就行了,那就直接就返回了,如果他被空的话,那else的话他才是不会空,它需要对后续的一个处理,那乘以它,那既然这个input它是一个接身。那你就应该让它转换成把这个string转换成接手瑞,那就拗一个接son啊。A2导包千万别导错了啊,还是强调这个导包,Org杰森。
08:02
啊,那把它传进去点吧。那出来的就是杰森瑞,就这么简单,哎,就是它。对吧,啊接受瑞,那这个接瑞呢,还是要在判空一下,比如说接受瑞,如果它等于等于空,那对不起,直接啊另一层合法校验。那下面是具体的业务逻辑哈,再往下是具体的业务逻辑。有着具体的循环便利。当中当中每一个元素,每一个元素,然后封装成返回值封。装成返回的事件名称。名称和事件类型、事件内容。对吧,哎,这样的一个逻辑哈,那你要循环便利这个金身和税,那怎么便利呢,简单。
09:06
第二,它的长度点缝。对吧,你这个长度这里面有几个值,我就得取出几个值啊,所以说按照它长度进行一个便历哈,按照长度一个遍历,那遍历完取出来的就是一个值,那每一个值里面它都有两个值,一个是事件的名称,一个是事件的内容,那这块呢,你有一个实际。哎,哇,这里面的存放的结果啊,Re up,这。那result里面一个呢,是这个事件的名称啊,RESULT0事件名称怎么取,通过谁取呢?通过接受和取啊。对吧,哎,就通过它取,那它点get杰森object传进谁呢?哎呀,你是第几号元素啊,对吧,这是第几号元素。
10:04
那这块你看啊,我看大家不知道还能不能跟上啊,现在我们相当于处理的是这个ET这块。ET传进来的这个这个UDTF传进ET,那ET呢,现在是循环便利这个精神数组里面的每一个元素。那首先出来是他呀,拿一个吧。嗯,到到这儿。也就是说到这块的时候,它是每一个式循环,它取出来的是它。不知道能不能理解啊,你说ET里面其中的一张表,DSP啊,DS play啊和下面的内容,那下面的内容呢,这个result我就要封装两个返回值,一个呢是把这个en。它的类型封装到这里面,另一个呢,是把下面这个整体封装到一个阶层里面去。啊,返回这两个哈,那我先取它,先取它,那我就是这个这点get接成object I啊,因为这是数组其中的一个函数I之后,然后点。
11:05
啊,点什么呢?那我要想取出的是en啊en那点get。干的使劲传进去也。啊,捋一下这个逻辑哈,捋一下这个逻辑。这样的一个关系。看好了啊,看好了,也就是说你现在这每一次循环相当于是取出来的,比如说DD零号吧,啊,这个I等于零的时候进来了,I等于零的时候,那这里面这个I就等于零,那取出来的就是这个值,那这个值里面我要取出en的值,那就直接get是en就能把这个值封装完,那下一个下一个是RESULT1。一一等于什么呢?一直接等于加点get。是这里面传的是谁呢?I就行了,嗯。
12:00
对吧?啊,第几号元素啊,看一下啊,应该是就是这样的啊。大家看一下这块逻辑对吧,哎,直接取的就是I啊,取的是I就可以了啊。行,也是相当于我们把这个整体哈,看好了,它是整体,并没有我直接没有取证啊,没有取它哈,记住了哈,不是你们想象的直接取它,我们后续呢,是取到它之后,我可以点点它,然后在点这下面呢,具体的这个值也能把这个值取出来。啊,是这样一个过程哈,所以说我没有把这个直接取出来。行,那这是这一块啊循环,每次循环呢,返回值呢,都是事件的名称,事件的整体啊整体,那这块呢,要加一个这个呃,Check啊,担心它出问题,比如说在解析的过程当中,如果出问题你怎么办?尤其是这块盖的时候,你获取不到它就会抛箱的异常,那这块呢,抛一个是杰森。G son,嗯,Except啊,而且这个报名是这里的啊,报名是这里的,OK,然后一把它放在一起。
13:06
圈里面去,那如果他解析失败了,就是这块抛异常怎么办呢?哎,直接continue,直接继续啊,继续解析下一个啊,不要因为这个某一个原因在这抛异常了,直接挂掉啊,直接挂掉了啊,所以说继续,那这呢是正常的这个解析把这块拿掉啊。解析完之后,相当于是处理完一个了,类似于我们这个,呃,这个MR当中的map,处理完之后,你是不是contact.right写出去啊,哎,那这里面呢,用到了是一个forward。啊往出写值,写谁呢呀,因为你已经把这个里面封装完了,你对应的这个啊想要的值。Forward result。啊,这个是得放在外面。对吧,啊,放到外面。天稍微处理一下啊。
14:03
强迫症啊,没办法。啊行,那这块呢,就是往外循环写出。啊,写出写出的一个过程,那这个呢,UDTF,我们就解析完毕了,啊解析完毕了,那么稍微回顾一下这个函数的一个书写,那首先呢,是这个第一个类继承了UD,呃,在一个udtf,然后呢,重写里面三个方法分别是process和对应的close,那首先呢,是这个Internet里面干了两件事儿,一个呢是定义返回值的一个名称,还有呢,定义返回值的一个类型的一个约束。啊,一个约束,那这里面我定义了一个name,一个杰森啊,而且我这个写代码的特点呢,就是你需要啥你就返回啥。需要啥防卫上之后呢,下面是process具体的业务逻辑,业务逻辑呢,这里面本来支持的是多进多出,所以说这里面是一个object数组。啊数组那数组的话,那只不过我这里面是一行进来多行出去啊,我用的是一进多出,那只取这个零就行了,否则的话你还有循环便利呢,对吧,你要多进多出。
15:12
那好,然后突使劲,因为它进来的,我们知道它就是一个接乘OZ是一个实质类型啊,这不串好拿到它,拿它之后呢,对它进行一个判空,如果它等于空的话,直接return返回了啊,相当于是直接干掉了。那再之后它下面的话,就具体的它是不是一个接,那我要对这个把它实类型转换成接瑞,进行后续的一个处理,那对应的这个介程瑞呢,我们要对它进行一个循环变历,取出里面一个一个的值。啊,提出一个一个的值,比如说这块。便利这个JA身瑞这里面的值,那你要是有两个的话,来取出第一个,然后取出第二个,那遍历每一个元素里面干什么事呢?取出两个值,一个呢是对应的事件名称,另一个呢是事件整体,就是杰森。啊啊,这个呢是en啊这么几个值好。
16:05
那现在我们这里面正好啊一个呢是零,它取的就是这个一这个值,那绕一呢,取的是这个整体。啊,如果解析失败肯定就继续,那只要处理完之后forward写出,然后继续下一次循环啊,再往出写啊,不断的写啊啊那这个结束了之后呢,我们来开始哈,打包一下,因为这个来这个udf和UDTF要打包上传到集群上。
我来说两句