00:00
那我们再来给大家统一的说一说table API和flink CQ里边没有办法绕过的另外一个主要的一个概念,那就是函数啊,因为作为上层API主要的特点,其实table API和CQ啊,就是要给大家提供很多很方便应用的函数,这样的话我们就可以不关注底层,只考虑业务逻辑了啊,所以这个过程其实还是非常呃,就是很很重要的一部分内容啊啊,但是呢,这里面我们就想到了,它提供的函数特别特别多啊,特别特别繁杂,所以说我们这里不可能给大家一一的介绍到,那主体来讲呢,我们主要给大家介绍两类函数,一类是啊,就是flink CQ啊和table API里边给我们已经提供了的内置函数,就是系统内嵌函数直接可以调,对吧,你来了之后直接写这个就语法都是正确的,就像我们前面直接点对吧,某一个字段点直接点。
01:00
啊,或者说点avg啊,Average这些都是合合理的合法的,那另外还有一些呢,如果说我们自己想要的操作,现在它没有实现,不支持那怎么办呢?诶,那其实也非常简单啊,就是我们可以自定义UDF函数对吧,然后去自己去调用就可以了啊所以前面关于这一个系统内置函数呢,这里边我们分门别类的给大家大致的讲一下,当然现在已经实现的啊,Table API和CQL里边的很多函数啊,我们这里面都没列出来啊,因为我们知道这个CQ本身啊,这个语法就是支持很多内置函数的,那现在这个弗LIC的目标当然也是向着就是把C支持的那些东西都支持,而且呢,还要扩展出我们当前流处理的很多特性来啊,就是所有的应用应用都可以用函数搞定嘛,啊,所以这个函数是非常庞杂的,我们只能是稍微的给大家做一个了解啊,啊那比方说。
02:00
这里边主要可以分成几大类呢?内置函数里边主要这么几大类,首先基本的有比较函数啊,这个非常简单,其实大家知道这就是一个比较运算符嘛,CQ里边的话,比方说判断相等直接就是等号啊,大于小于直接就是大于小于号对吧?啊为什么列这个呢?主要是因为table国API里边有所不同,主要不同就不同在判断相等对吧?因为我们当时给大家说的判断相等的时候,Table API里边都是一个expression啊,它对于每一个字段呢,是用了skyla里边的那个symbol那个就是一个前面有一单引号来表示这样一个字段的,所以你不能直接用我们Java或者SC拉语法里面的双等号去判断它相等,而应该要用三等号对吧?影视转换里面有这样的一个影式的啊方法啊,影式的函数用这个来判断相等,那至于大于小于等于,呃,就是大于小于,或者是这个大于等于小于等于啊,这些基本上都是差不多的。
03:00
啊,那当然了,就是遇到等号的地方可能会稍微注意一点啊,大家稍微注意一下就可以,然后另外还有就是逻辑函数,逻辑函数就是一个逻辑表达式了啊CQ里边的话,我们直接就是两个布尔类型的逻辑表达式,直接二这是表示或对吧与或非嘛,啊那这里边比较特别的其实就是这个呃,飞在做这个取飞运算的时候呢,CQ里边常见的是nott,一个波尔类型对吧?那另外还可以有一个判断叫什么呢?一个布尔类型,一个布尔表达式is false is false的话,意思就是说如果它是真,那么它is false就变成了假,对吧?那如果它是假,它本身是false,那false就变成了真,所以就相当于做了一个这个啊not一个反转的一个类型吧,啊,这个是类似的啊,同样table API里边也有对应的实现啊,你看这里边这个,呃,这个羽或飞的话,那我们用的就是本身内嵌在Java scla语言里边。
04:00
这个雨浩飞的表达了啊,那如果说你要是这个想要判断他做这个反转啊,非非的这个反转的话,可以用感叹号这个表示not这个含义,那你如果说是要用这个布尔类型is false,你怎么办呢?啊调方法对吧,我们说这个tla里边,它是一个完全的面对对象的语言,也是一个函数式的语言嘛,啊那这里面就是一切接对象,一切接函数啊,都是这个方法调用啊,一调这个布尔类型的is false方法就可以判断了,这里边稍微去输,呃,需要注意区别的是就是这两个有什么区别呢?你看is false和这个直接取飞有什么区别呢?啊,就是如果它的有当前有这个true false的值的话,这个就没什么区别,都是一样的,对吧,等价,但是如果说出现这个unknown数据类型的话,就不明确当前它到到底是什么对吧?呃,就是还没有定义的时候,那这个unknown的话,如果是这里边is false判断。
05:00
Unknown也会返回false,因为它确实不是false嘛,对吧,就会返回一个false,但是如果要是这个取非运算的话,Unknown返回的也是unknown对吧?就当前并不知道,所以说取飞之后还是unknown稍微一点细小的区别啊,另外还有这个算术函数了,算术函数就是加加减减对吧,加减乘除啊,另外还有比方说这里大家主要就是区别一下table API和CQ里边的调用方式不一样,基本运算的话,这个当然都一样了,有这个符号操作嘛,那对于这个比方说这个power大家知道是呃,做一个这个求密运算对吧?几次方的一个运算,那对于CQ而言呢,它是标准的一个函数调用,多参数的函数调用,对吧?传两个数值进来,表示前面这个数的后面这个数次方啊,那如果说如我们是table API调用呢,它用的是方法调用对吧?啊,直接调用当前这个数的一个方法点power,然后把后面这个。
06:00
参数传入啊,所以这个就是风格上来讲,基本上就是这个区别了,别的都没有什么大的差别啊,啊后面我们再看一些稍微有特色的一些分类,就是比方说字符串函数,专门用来处理字符串操作的啊,那比方说前面这个CQ里边,它的这个看起来像或的这个符号表示什么呢?表示字符串连接对吧?啊,那与之对应的在table API里边字符串连接就就是加了对吧,两个string类型直接加,这就是连接,那另外如果说upper,一个string,这就是直接转为大写形式,那对应的table API里边调调这个方法对吧?呃,一个string直接调这个upper case方法,那如果说这个char lengths啊,里边到底字符串的长度是多少?呃,你这里边是调一个函数传字符串作为一个参数传进去,那我们这边同样也是调它的char length方法啊,所以整体来讲就是这样的差别啊,就是这边是一个函数传参,这边是一个方法调用啊,那还。
07:00
这有一个比较有特色的函数类型是时间函数,那就是前面我们已经提到过,怎么样获取到刚才的一个time stamp,对吧?啊,那这里面比方说date,一个string,那是干什么呢?就是按照我们的那个年月日啊,YYYYMMDD啊解析这样的一个字符串,返回一个CQ的date类型,对吧?啊,那与之对应的这里边你怎么样呢?就是一个string to date嘛,这方法就完了嘛,啊那同样一个time stamp,一个string,那是干什么呢?同样还是按照我们的那个就是YYYYMMDD后面还跟上十分秒对吧?呃,这样的一个字符串类型解析返回一个CQ里边的time step类型对吧,一个一个这个时间戳的类型,那同样在table API里边呢,直接to time step啊,所以这种调用大家可能会发现,可能还是table API好用一点,对吧,这个方法调用的话,这个更直观啊,更容易理解它是什么含义啊,然后还有就是获取当前时间了,当前时间car。
08:00
Time对吧,直接调这个方法就完事,那我们这里边也有一个current time,那还有一个就是这里边有一个这个interval string range,这是说什么呢?这就是我们说在CQ里边要表示一个时间长度,时间间隔的时候,怎么怎么表示呢?用interval关键字后边给一个string,大家还记得吧?哎,当当时我们给一个十对吧,引号引起来这是一个string,然后后面来一个range,其实就是second,或者说minute day对吧,就这样去写就完事了,注意后边这个呢,是单数对吧?这里边这个单位都是一个单数,这是CQ里面的写法啊,那应这个table API里边呢,这里边写的就是一个数,直接调它的方法,点days minutes对吧?哎,这里边是这个复数,当然本身这个table API里面你写单数也是可以的,一般我们区分的话,就这里边写复数对吧,写一个复数就是哎,十天十点倍,两分钟2.minutes啊直接这么写就。
09:00
完事了,然后最后还有一大类,我们也是经翅会用到,也是比较感兴趣的,就是所谓的聚合函数了,聚合函数呢,CQ里边就实现的就会比较多,大家看到这个聚合可以怎么聚合,你想这count对吧?呃,Sum sum里边可以给一个表达式啊啊count可以给一个这个字段,多个字段都可以,然后呢,还有一个rank rank指的是什么呢?Rank指的是聚合之后的排名对吧,排排序的那个序列,序列号位置,所以这就可以先去做一个,呃,当前做一个排序聚合,然后之后做一个排序对吧?输出当前它到底是第几个第几位,另外与之对应的还有一个row number,就输出聚合之后啊得到的行号,对吧?每一行它的那个行号到底是多少?这两个操作在有一些场景里边就会非常非常有用,对吧?啊,就是假如说我们有排序操作的时候,你直接调这个就非常给力啊,但是大家看这个很可惜,Table API里面。
10:00
啊哦,你要这个count的话,一个你可以直接这个field一个字段直接调点count对吧,Some的话可以直接点some,那这里边这个SOME0是干嘛呢?它跟sum其实差不多,它只是说如果你要取的这个所有的这个字段里边啊,所有值都为now,也就是说没值的话要返回默认返回一个零对吧?呃,就是如果说是sum的话,那它也是直接返回nu的啊呃,它主要处理这种就是如果没值的时候加,要不要给一个默认的返回值啊,那大家看到这个table API里边目前还没有实现rank和中number类似的这样的聚合函数啊,所以说如果在实际操作过程当中,可能有一些场景呢,用CQ,它的函数会更加的丰富,应用更加广泛一些啊,当然现在就是还都不完善,都在快速的发展过程当中,大家要保持一个开放的心态,随时关注啊,就是用到什么的时候,我们去查嘛,看到这一方面如果他有支持。
11:00
这个函数,那我们直接拿来用就可以了。
我来说两句