00:00
来大家一起看一下啊,那这个打开的这个页面呢,就是我们have官网当中对UDTF函数的一个呃,使用的说明介绍啊,来往下看一下,那这个帖子其实有点早了,一一年的啊,到这儿有这个快十年了是吧,当然这个在这十年当中呢,我们这个UDTF函数呢,几乎没有发生变化,就是这样的啊,那所以这个不影响咱们使用,咱们往下看就行啊,往下翻,那这个帖子里边有一段话,就这段话,这段话呢,是对咱们UDTF函数这个使用的一个详细的介绍,你只要把这段话能读明白,那你的UDTF函数你就会写了。啊,可以这样明确的告诉大家啊,但是这的话呢,不是那么好懂的啊,然后往下翻,下边呢,有什么有这个UDTF的例子对吧?那就是一会儿呢,咱们就可以直接把这个例子粘过去,把逻辑改一改,搞定啊就是可以这么搞啊好,那现在呢,我们代码不着急,我们现在呢,来一起把这段话来读一下啊,一起把这话读一下啊来一点点来啊有没有英语好的呀,给大家翻译一下是吧?来我们一起读吧,来a custom UD TF就是一个自定义的UDTF函数,对吧?嗯,怎么可以,怎么被创建出来,Can be created by,怎么说extending the generate UD TF,呃,Abstract class什么意思?就是我们要想创建一个自定义的UDTF,那我们需要去继承JAUDTF函数啊,第二,不是,就是JAUDTF这样的一个抽象类,对吧?啊就集成它就行了,完事之后呢,既然它是抽象类,是不是肯定得有方法需要我们去实现呀,对吧,那实现什么方法呢?往下往下往下看。
01:38
以你方法。Process方法,然后呢,Possibly就是也有可能会实现一个close方法,是不是需要实现这样的三个方法呀,当然close方法呢,可以实现也可以不实现啊,那一般情况下什么时候才会用到close方法呀,你比如说我在这个函数当中啊,我需要调用其他接口的数据,比如说调用MYSQL里边的数据啊,对吧,那你跟MYSQL获取通讯是不是得有连接对不对,那你这个函数用完之后呢,你需要把这个连接关掉,关掉,那这时候可以在close方法里边去实现它,那所以说这个呢,咱们就不用实现了啊,不用实现了啊,然后给大家说一下啊,就是我们这几个函数它是怎么调用的,调用顺序是怎么样的,那肯定是谁谁先调用啊。
02:19
Process不是这个先先调用完之后呢,是谁process啊,然后最后呢,是这个close是这样一个过程啊啊,那再往下走。看一看这仨方法都是干什么的,把这个搞清楚,那咱们代码就会一样往下看啊,来这先看第一个方法,以initialize方法,初始化方法,对吧?来看一下它是干什么用的,The initialize方法。Is called by by谁,By have to notify the UD TF the argument types to expect。这个发音就不用管了啊,咱们刚才这是有同学笑了,哎,这个什么意思啊,这句话其实不太好理解。
03:04
也就是说,以泥赖的方法是被谁调用呢?是被have调用的,被have调用干什么?是不是notify就是通知对吧,通知谁通知那个UD函数,就通知我们自己写写通知我们对吧,通通知我们什么呢?通知我们和argument types。是不是就是参数类型啊。对不对,参数类型,那这句话整体的意思是什么啊,就是说我们这个函数你写完了,把包提交到have里边,你去调用它的时候,那你调用这个函数,那首先have会先调用以尼时代的方法啊,然后呢,它调用这个方法呢,它会通知你,你这个函数接收到的参数的类型。啊,什么意思啊,就是OK,我这个函数写完了,那我去执行,执行是不是得给它传参呀,对不对,那传参的时候,那还就会调用这个方法告诉你这个函数,我这个参数的类型是什么,哎,那我问大家一下,你说它这么去做的话,那我们能够通过以尼时代的方法干啥。
04:06
也就说白了,你在以逆赖的方法里边,是不是就能够获取到你传到这个函数里边的参数类型啊,是不是就这个意思,那你说你获取到它参数类型之后,你能干啥呀?你写代码的时候能干啥?是不是能对它进行校验呀,对不对,我是不是在引式代的方法里边能够获取到这个函数被传进来的参数的类型。对不对,那货源类型我就可以对它进行校验了,也就是说你这个函数,一个函数写完之后,它是不是参数类型得是固定的呀,我要求你传死缀,你给我传印的就不行,哎,是不是咱们能在这里边做校验呀,哎,这是哎这个方法的第一个作用,咱们要搞清楚,那第二个作用是干什么呢?往后看。UDTF,其实这儿呢,不应该是UDTF,这应该是谁啊,这呢应该是指的是这个以以伊酸奈的方法啊,应该是它啊啊这个方法,然后呢,然后这个方法必须返回一个object inspector这个东西大家之前有没有见过?
05:07
Object inspector叫做对象检查器对吧?啊,对象inspect检查器的意思,那这个对象感器是我们害过这个源码当中比较重要的一个概念啊,在这呢,我们就呃这么去理解它就行了,大家记住啊,对象检查器当中,你就记住它里边封装了我们have当中的这个数据类型。啊,这个怎么理解啊,我们have当中数据类型是不是有很多呀,有基础数据类型,有复杂数据类型,那基础的有谁,In string big in等等等等,是不是有这么多的类型,那这个复杂的呢,有啥?Map类型,呃,RA类型,磁串类型对不对啊,然后呢,每一个类型都有一个对应的对象检查器啊,就是说对象检查器呢,它里边封装了每个类型的,哎,这个类型啊,每个类型封装每个类型啊,这个怎么理解,比如说我string就有一个string object inspector,那我从string object inspector里边呢,我能获取到我这个string类型啊,就是相当于是对类型的一个封装啊,咱把这点搞清楚。
06:12
啊好,那也就是说你这个以泥生态的方法,你需要返回一个对象检查器,对吧,然后对象检查器里边呢,包含了啊一个类型。啊,包含一个类型,那这个类型是谁的类型呢?往后看啊,谁类型是不是你这个,呃,The role啊,Object啊,然后呢,The the UD TF will generate。啊,这是什么意思啊?是不是就这个UDTF将来要返回的这个结果呀。啊,所以这句话整体来说怎么理解啊,就是你这个引进的方法呢,最终你还得返回一个对象检查器啊,谁的对象检查器呢,刚才说了对象检查器是不是跟类型是对应的呀,一个一个类型对应一个对压压器对不对,那谁的类型啊,是不是应该是你这个函数的输出的类型啊。
07:03
对不对啊,那也就是说咱们这儿呢,就定下来了,那以尼射类的方法,它是干什么用的,其实有两个作用,第一个第一个作用啊,就是干什么,是不是可以接收参数类型,然后呢,你利用接收到的参数类型对它进行校验。啊,如果说类型不符,那就没有必要往下进行了,直接抛异常就行啊,这是第一个作用,那第二个作用呢,我还得干啥,我还得把咱们这个函数将来要输出的类型是不是也得给他指明一下啊,通过谁指明是不是通过这个对象检查器指明对不对,那have调用隐射来方法,它就会得到咱们这个函数输出的类型,那得到数据类型之后呢,它就会干什么呀?它就会对我们这个函数真正的输出啊进行一个校验,是这样的啊,所以最终总结一下以尼射代的方法,俩作用,一个作用呢是干什么,是限定咱们这个函数的输入类型,那还有一个作用呢,是定咱们这个函数的输出类型,能理解吧,这有它的作用,只只不过这句话呢,有点不太好理解,但是咱们自己呃,想透了之后,就是这俩作用,一个是限定输入类型,一个是限定输出类型。
08:10
啊,这是你方法它的这个作用完了也往下走啊,那下边呢,这儿说,呃,Ones方法啊,就是一旦这个方法被调用了,那这时候have会干什么?往下看啊,Have will give Rose to the u TF using the process method。啊,就是一旦这个方法被调用了,那have呢,就会将。Rose Rose指的是谁行一,一行一行的对不对,因为你这个函数怎么用的,是不是你select,然后这个函数辅绕某一张表,也就说你这张表里的数据是不是会一行一行的传输到这个函数里边来呀,对不对,那也就是说,嗯,那我会把一行一行的数据呢,传给UTF,那通过谁传呢?是不是通过process方法传呀,对不对,它是循环调用process方法呢啊,就是一行我调一次process,一行调一次process,那所以说在这个方法里边,咱们应该的逻辑呢,就是啥,是不是就处理每一行数据啊。
09:10
啊,拉一行处理一行,来一行处理行,就是这个逻辑啊,完了之后,那咱们再想想啊,你说我这个UDTF函数的逻辑应该是什么呀,咱们逻辑应该是什么呀。那你给进来的一行应该是什么?是不是就是一个杰森数组的字符串,那咱们这个逻辑应该是啥?是不是将这个杰森数组给它解析出来,解析成一个一个的杰森对不对?然后呢,把一个一个杰森是不是以一行一行的给它输出去就完事了呀,哎,就是这个逻辑嘛,那这里边到底怎么做呢?然后后边是告诉你了,那在process方法里边啊,那你需要怎么做,则UDTF啊可以produce是不是就是生产呀,或者就是往外输出,其实就是啊,可以输出咱们咱们的这个解析之后的行,那怎么解析,怎么输出呢?通过调用。Forward方法。啊,哎,就完事了,那所以说这里边到底怎么做,哎,OK,那这是我传给process,也就是咱们UDTF函数的一行数据是不是给他了,那在这个方法里边,咱们需要怎么做,需要将这个函数是将将这个字符串,这个数组需要给它是不是给它解析解析啊对吧?那解析成一个一个的这个数,这个阶S,那解析完之后呢,那我这一个一个的杰森怎么输出呢?通过谁通过forward输出,那forward,哎一个杰森,再forward个杰森,再forward一个杰森,再forward的一个杰森啊其实是这么去做的啊,那所以这样一来的话,是不是就是一行最终就变成多行输出数据了呀,它是这样的一个逻辑啊,那落实到代码当中,咱这里边到底怎么做呢?其实很简单,在process方法里边,咱们拿到一个接森数组,然后呢,我们需要去遍利这个接森数组,然后呢去循环调用forward的方法啊,一个元素啊,通过forward往外输出一次,一个元素输出一次,哎,那就完事了,那咱们的UDTF不就写写完了,那是不是就相当是。
10:59
进来一行,输出多行啊,就搞定了,这就是咱们UDTF函数它的这个实现方法啊,所以说这段话呢,其实是UDTF函数的一个精髓,你只要把它搞明白了,那这个方法,这个函数怎么写,咱们就会了啊好,那我把视频录一下。
我来说两句