00:00
光有这个工具类那不行,对吧,得有这个UDTF函数啊呃,那这边呢,我们就肯定写在这个地方方式。对吧,还是写在这个函数里边啊好,那这边呢,我们得去看一下了,哎,自定义函数怎么写,上午呢,我们找了很多的这个,呃,自带的这个函数对吧?啊,它自己系统自己的,那这个时候呢,我们再看一下啊,方式里边,那还有一个use DeFine方式,它呢,Flink当中有四种对吧?呃,普通的标量函数。Table。表函数。啊,那就是udtr分数。Aggregate的方程A对吧?Udf啊,UDTFUDAF啊,那聚合对吧,还有一个TF。又是聚合又是炸裂对吧,往往求他们,但是这里面有一个点要注意一下啊。就是这四种函数呢,它比较特殊一点,它只能用在这个able PI里边啊。
01:02
TABLE1篇,也就是说在课里边没法用。他目前来说搜个里边用不了。没有实现这个功能,其他的这三个可以在S里面用。就是你你写弗Li circle可以,写TABLE1篇也可以啊,大家注意一下这个事啊,好,那我们也无所谓的,我们用的是table方程啊,它两个都可以啊,那么点过来,过来之后呢,这边有个例子啊,这边有例子,但是我们要看懂这个例子啊。啊,那这边呢,他也写了一个切分,往往来说都是做切分开对吧,就是做切分好,那首先上面这个注解定义的就是输出数据的列名和类型。对吧,好,那炸裂的时候我们知道,呃,炸裂呢叫一进。脱出对吧。那这个一跟这个多怎么理解啊。
02:04
这个一和多是怎么理解的?嗯。一行和多行对。一列多行吗?一列多行吗?这个一进多出指的是一列变多行吗?不是一行变多行吗?对吧?那比方说我现在有这个,呃,刚才看到它切词对吧?啊,商归骨它切成了上和硅谷这两个词,那你把商归骨输进去,本来商微骨在一行。
03:02
对吧,现在变成了上和硅谷两行了,对吧,是行与行之间的转换啊,就是说一行变多行,这个要注意一下啊。对吧,好,那。对于我们函数而言,都是这样子的,像标量函数UDF对吧,Udf它是一进一出也是行。对吧,那还有聚合函数叫多进一处,也是从行的角度来说的,把多行数据聚合成一行数据,那有没有说列。有没有说列啊,大家想。我们没有说列吧,所以在这个里边要注意一下啊,就是说无论这种函数呢,嗯,UD udf还是UDTF等等这些内容啊,跟列没关系,也就是说你可以输入多个列。比方说NVL或者。
04:01
这个函数大家说它是属于什么?是udf呢?还是udf还是UDTF呢?类似于NVL,还有那个。这种函数。他是不是接收多个参数,然后出来一个结果啊,这个属于多进一出,那我们能把它算作这个叫。聚合函数嘛,大家想一下。不能吧,是不是。对吧,啊,所以要注意一下啊,就是说这个地方呢。一跟多指的是什么呢?一根多指的是行,跟列没关系,也就是说嗯,你可以是多个列进来,也可以是多个列出去,那比方说官方给我们的例子就是这样,虽然炸裂函数我们知道叫一进多出,它同时炸裂出来两个列。
05:08
一个word。啊,就跟列没关系,你记住这个事儿。输入数据可以是多个列,输出数据也可以是多个列,OK吧,是这个意思啊,这要注意一下好吧,好,那我们这个是上面的定义类型,那我们只要一个列就够了,对吧?啊,所以呢,我们也叫我们也叫斯的方程得了,我把这一套拿过来对吧,把这把这个整个拿过来啊。哎,我我先拿它吧,就拿它啊。方式里边我们就叫这个的方式啊,然后呢,它刚才我们看到继承这个table方式吧。我放下。啊,输入数据类型是string,然后更重要的是上面这个定义我们得拿一下对吧。上面的这个定义啊,找一下这个包对吧?哎,这边K个方程,我们去看一下它说什么东西。
06:05
呃,下载一下这个元宝包啊。这个T。我看一下这个T呢,应该是一个。Use DeFine啊,这是output啊,Output输出数据类型。对吧,这输出数据类型啊,行,那这个我们就不能写T了,因为输出数据类型呢,在这。我们输出呢,就一个单词对吧,是列名啊,可看你要看懂这个东西,这是列名是说我们任何一个函数,它是不是都有自己默认的列名啊,对吧,Was就是列名,这个是它的类型对吧?所以呢,我们这个地方用的肉啊,那这个地方我们也就可以用一个肉,这这个肉呢,是呃,At,不是这个fli。另一个types这个啊,好,那我们就用肉,那这里面呢,要实现一个方法,当然也不能用实现,它是通过这个方法名通过反射的方式来调的,也就是说它并不需要加override这种关键词,对吧?啊,那这个呢,你一定要注意一下,这个方法的名字一定是它啊,不能是其他的对吧?好。
07:18
嗯,那我我把这个也拿过来吧,因为这个确实比较简单啊,我们拿过来。好,嗯,那这个呢,我们算一下evaluate这个方法对吧,那这里边儿是一个str。这个数据。对吧,呃,那我们要做切词啊,怎么做切词呢?很简单,来这边我们用它的工具类叫keyor YouTube。Split word我们的一个一个单词对吧,那这边呢,是我们的UD函数了,Utf函数了,对吧,那我们这个异常,那我们可以自己去比一下,大家可以想一下,如果说这块发生异常,我们得怎么办。
08:06
说明切词失败了对不对,那切词失败怎么办?啊,然后这边我们写点不循环啊,一个一个的单词,然后把单词写出。那个。Word啊,把这个单词写出就行了,遍历并写出啊。这个是切丝。这是病例。B接触,那这样的话,我们是不是当我们调用一次这个函数。一个方法调用一次输出了多个呀,所以这种呢。跟我们在如果说我们拿data stream来做,我们应该用哪个函数啊。
09:01
Data STEM当中哪个函数相当于是一个udtf啊?对friend map做一个压平。Map啊好,那我们想一下,如果说这个地方这个地方啊。如果说这个地方它。异常了,也就是说它分词分失败了。我们我们应该怎么处理一下呢?当然我们这样写没有问题啊,大家把异常抛出来了。对吧,把异常信息做一个打印,我们手动开了任务也不会挂掉。对吧,那你想想看,如果在公司当中,我们应该。怎么处理一下比较好一点?啊,或者说就这样也可以。
10:02
分词失败了对吧,要不要让这个任务挂掉。就是这个问题啊,当然我们可以在这手动写一个异常出去,让肉挂着返回原磁。那你有同学就意思就是说,如果说发生异常了,那我们就怎么办呢?一边写一个roll.off把这个str写出去。啊,返回原词也可以,那其实也可以不处理,为什么可以不处理呢?我们我们想一下啊,我们讲一下可以吧,那如果说你真的失败了,那我就少一个词呗。我肯定不能让任务挂掉,没必要对吧,因为你是搜索的关键词,我多一个词或者少一个词。重要吗?对吧,我本来就是行为数据当中的一个搜索的关键词,说我在统计分析的时候多一个或者少一个。
11:00
是不是也没有关系啊。这个没问题吧。对吧?啊,所以说这块呢,其实还好处不处理的话都还行,那有的人说把这个原词返回,那我们就把这个返回可以吧,啊是这个意思啊,行,那这个就返回言词啊,不是说不是说return啊,这个这个方法来avoid对吧?啊直接connect把它写出去,当然你也可以在这儿把这个词呢,写到日志里边,或者打印一下,都都行都行,因为毕竟是行为数据嘛,对吧,一个词对于我们最终的结果影响没那么大,对吧?所以你不要在这边也抛一个异常出去,让任务挂掉,他倒不至于影响到那么大,OK吧?啊所以说你遇到异常之后啊,在工程当中,特别是处理异常的时候,要要想一想。非常未来会带来什么危害?对吧,啊,未来会带来什么障碍,如果说没有什么危害,那其实你可以抓到这个异常之后。你你直接就把异常都不打印,直接就过了,对吧,啊,什么都不处理,这个数据丢了丢了无所谓,对吧,是这意思啊。
我来说两句