00:00
接下来我们讲一下table API和flink CQ里边的函数,那所谓的函数大家其实就知道,这就是实现一定功能的代码的一个封装对吧?呃,就是某些功能它是现成的,我们直接调一个函数就完事了,在CQ里边本身原生是有很多支持的函数的,这个大家都知道对吧?呃,就像我们这个CQ里边,你直接sum啊,直接这个avg求平均值啊,直接count啊,这都是大家非常简单非常常用的啊,这些一般的聚合函数啊,所以table API和CQ里边呢,都已经对这些做了一个实现,所以函数这一部分主要呢,可以分成两大类来做学习,一类就是系统已经给我们直接提供的所谓的内置函数啊,就是system built in,对吧,也已经是嵌在当前的table API和CQ里边的,我们直接拿来用就完事了,那当然另外还有一大类,就是现在还没有的功能,我们需要去自定义,我们首先来给大家说这个系统内置。
01:00
函数啊啊,内置函数其实现在已经非常非常多了,大家在官网上也可以看到那个量非常的大啊,我们这里边就是呃,选取其中的几个非常有代表性的类别,然后里边的一些有代表性的操作给大家来看一下啊。呃,那首先我们看到最简单的函数就是比较函数啊,其实这个比较函数在某些场景下,大家会发现这其实不应该叫函数,这就是一个表达式对吧?呃,但是在对于这个table API和CQ而言,底层,它相当于也是一个函数。也是做了一个特定的操作对吧?啊,它是把这个表达式要翻译成函数的,那么我们看一下比较函数的话,在CQ里边写法当然就是直接两个数相等的话,呃相直接等号连接对吧?如果大于小于的话,用一个大于号小于号连接就完事了啊,那么对应的在table API里边,大家注意啊,Table API里面其实标准的表达式取等的这个写法是。三等号。
02:00
啊,那大家知道为什么,为什么他要用这个呢?因为table API它是内嵌在语言里边的,对吧?呃,内嵌在语言里边的话,语言里边的单等号其实是。其实是赋值对吧,那语言里面的双等号,那是一般我们的那个,呃,就是比方说Java scale拉里面的运算符对吧?啊,就是比较那个相等的时候的运算符,所以这里边我们如果要用CQ或者table API里边语义的相等的话,它用的这个表达式标准写法是三等。但是有时候大家会发现在table API里边,你把它都括起来了嘛,对吧,呃,就是引号都引起来了,你用那个单独的等号其实也是可以的啊,它是支持这种写法的,所以这个其实也不重要。那另外还有一类就是逻辑函数,逻辑函数就是我们说的与或非嘛,做一个逻辑值的判断啊,那像CQ里边非常简单,两个布尔类型的值啊,与或非呢,就是直接or对吧?啊,那另外如果要是取非这个大家稍微注意一点啊。呃,就是非的话,就是我可以用一个布尔类型的值is false,这个是不是就可以判断出当前这个值是否。
03:06
大家想这个is false意思就是它为真的话,它is false是不是就为假呀?哎,如果它为false的话,是不是is false就是真啊,哎,所以它相当于就是对它做了一个取反对吧啊,那这里稍微要注意一下的是,还有另外一个大家更加熟悉的叫做not什么对吧,前面直接加一个not。这个表示什么意思呢?这也是取反的意思,对吧,就是如果这里边为真的话,我就为我就为假,如果为假的话就为真,哎,那它俩上下这两个表达式含义有什么区别呢。它俩的区别在于上面这个isfor,那大家想,如果我当前这个波尔类型的值本身,呃,本身它是一个一个空值啊,如果本身是一个nu的话,那这里边is false是不是它应该也是false啊。对吧,大家想它我判断的是它到底是不是false嘛,那你如果是空值是不是也是false啊呃,就是空值判断它是不是false,那是不是结果就不是对吧,所以是一个false,那这里边如果要是not,这里一个空值呢。
04:12
啊,它还是空值对吧?啊,这个大家要区分开啊,主要是这两者不一样,那对应的table API里面的写法大家看到就不是用这个end or这样的一个关键词了,而是要用就是我们语言里边对应的那个逻辑表达式了,啊就是直接这个语号括号,大家看这个或就是双数线对吧?啊语的话就是两个那个and的那个符号,那然后接下来如果取飞的话,大家看就类似于这里边都是一个方法调用对吧?啊就这里边直接是is false啊啊这就是这个判断,或者说前面我们直接加感叹号取反啊,这是逻辑函数,另外还有一大类是所谓的算术函数,算术函数就更加简单了,就是其实就是我们对应在那个呃,直观的来理解的话,就是一些就是ma啊,计算的一些那些功能吧,那在CQ里边,大家知道我们要做计算的时候,简单的算术计算,加减乘除的话,两数那直接就是加减乘除连起来就完事了,有一些复杂的运算的话,那比方说power对吧,那是把。
05:13
当前的两数都作为一个函数的参数啊,都作为参数传入的,而对应的这个table API里面,它的做法是什么呢?啊,大家就要注意,这里边我们既然这个Java sc都算是面对对象的语言,对吧,所以它里边是不是都是一个方法调用啊,啊这里边就都是我以一个当前的一个对象啊数值作为一个对象去调用它的一个方法,点power,然后去把它啊得到最后的这个结果。其实之前我们在写的过程当中,大家也发现了,我们做那个聚合的时候,是不是都是一个值,然后点count呀。写那个table API的时候大家还记得吧,都是这种写法,都是方法调用的写法,而在这个CQ里边都是直接一个函数,然后传参的这种写法。
06:00
风格大家熟悉了之后,后边就比较简单了啊,然后另外还有需要给大家说的是一个字符串函数,这个因为我们在处理字符串的时候往往会用到啊,各种各样的一种方法,那比方说像这个诶大家看CQ里边,我如果要是用这个货号啊,这看起来像货一样,就是双数线两个字符串做一个或这是什么意思呢。诶,大家注意,这就相当于table API里边的两个字符串加,这是不是就相当于我们的字符串连接啊,对吧,这字符串拼接的这这个操作啊,啊这个可能稍微特殊一点,所以给大家抽出来,然后另外你像一般的这个方法调用的话,这里边CQ就是函数对吧?就upper string,那这就是相当于当前这个string是不是要全部转成大写啊,非常简单啊,是字面意思非常的明确,那么对于这个table API来讲,是不是又是一个方法调用,直接就调这个string.upper case对吧?直接把它转成大写就完事了。然后另外你看前面这个,这是这是取什么。
07:03
是不是当前这个字符串的长度啊,字符长度啊,叉lengths,呃,那对应的这个在table API里面就是string,直接调这个方法,点叉LS就完事了,这就是两者这个我们调用函数的时候,调用方法的时候不同的特点啊,呃,那另外还需要给大家说一个比较特殊的类别,就是所谓的时间函数。时间函数的话,它主要就是做一些时间的相关转换和操作,对吧,因为大家知道在CQ里边,包括我们在这个Java语言里边也是也是一样啊,它有各种各样不同的时间类型,对不对?我们现在到目前为止最常见的时间类型其实就是提取出来那个时间戳,大家知道那就是一个长整型,对吧。啊,那这长整形的数其实在CQ里边是不作为时间字段直接去用的,那大家知道在CQ里边的时间有哪些?哎,对,比方说你看是不是有date类型啊,对吧,就是这这里边我们有对应的这样一个时时间日期的这样一个时间类型啊,它可以直接date一个string,就把当前的这个string表达的那个就相当于我们那个年月日十分秒,对吧?啊已经定好了,然后把它转换成一个date。
08:17
对应在table API里边就是一个to date的方法,对吧?把这个string直接to date就完了,那另外还有一个非常重要的数据类型,就是所谓的时间出time step,大家还记得之前我们讲那个处理时间事件时间如果定义了之后,它本身在内部的时间数据类型是什么吗?这对就是一个time stem3对吧?哎,所以这里边time STEM是CQ里边关于时间表达的一个非常重要的数据类型,那我们也是可以基于一个当前的这个string,直接把它生成一个对应的time step对吧,一个时间戳啊,那当然了,前面大家也记得,我们是不是也可以把一个长整型的数先转换成一个unix time,呃,Unix time对吧,先转换成一个那个标准的时间,然后再把它two time time转换成一个时间戳啊,这个也都是可以的,对吧?啊,但是就是我这里边转换时间戳的时候,一般都是要给一个string啊,给一个标准的string,那另外还有我可是不是可以获取当。
09:18
的系统时间啊,对吧,Current time啊,直接获取到当前的一个CQ的时间啊,你这table API里面就是一个current time方法嘛,另外还有一个需要给大家说的就是我们对于一段时间的一个表达。CQ里边的表达之前也已经说过了,这个表达是怎么写的,就是有一个固定的关键字叫interval对吧,Interval时间间隔,然后后面给一个string啊,大家还记得之前我们是不是都是都是这个,像这个interval写一个。后边那就是比方说这个。一对吧,呃,这个引号引起来,然后后边比方说second,对吧,就就是这样的一个表达啊,这就表示一秒钟,这就是CQ里边的一秒钟的写法,那如果说我们想要改变这个时间的这个长度的话,当然就是你可以改这个这里的这个字符串里边的值对吧?啊,把这个数值改大一点,还是引起来,然后后边呢,可以改这个单位对不对?Second改minute,改day对吧,改hour都是可以的,大家要注意的是后边的这个range啊,它这里边指的这个范围时间的单位啊,必须是单数,大家要注意这里必须是单数对吧?啊,然后下边的这个table API里边的用法呢,这个就更加简单一点,是不是就直接一个数,这个也不用赢起来一个数,然后直接点加单位就可以了,对吧,Days minutes直接加就可以了,这里大家注意,就是table API里面一般我们用的都是复数。
10:50
Table API里边其实是用单数也可以啊,但是为了要区分,我们一般就这里边直接就写复数了,对吧,就跟这那个CQL不太一样啊,CQL这里是要单数,这里我们要复数啊,当然了,除了前面的这些简单的一些函数之外,另外大家在官网里面也可以看到,比方说有这个哈希函数啊,哈希函数大家知道就是各种不同的哈希算法,我们可以基于一个值求出一个对应的哈希的那个数值,对吧?啊,去做一个这个散列转换啊呃,这个我们就不去详细说了,这里面重点要给大家说的是另外一大类,就是所谓的。
11:27
聚合函数,大家看前面我们所有的这些函数,我说他们都算简单函数,因为它相当于只是一个什么操作啊。只是一个简单转换对不对?哎,或者说你这个像做比较做逻辑判断的话,相当于是把它转换成一个一个布尔类型嘛,对吧?哎,所以这里边其实相当于都是一个简单的转换函数啊,一对一的这样的一个转换,那这里面聚合函数的话,是不是含义就不一样了,它理论上来讲是不是相当于我可以做一个多条数据,最后聚合出一个结果啊。有点像一个多对一个一的关系了啊,那其实这个聚合函数大家更加熟悉的话,呃,更加熟悉的啊,就一般情况我们前面都要做一个group by对吧?那我先做了这个分组之后,然后分组去做聚合嘛,那后边你像我们这里边这个CQL里边count是不是可以直接统计当前某一个字段的个数啊呃,统计聚合这个个数啊,然后这个sum,那是不是就是对于某一个字段啊,或者某一个表达式去进行一个求和操作对吧?那另外你看这个CQ里边还有这个rank row number,这是不是可以排序之后取它的当前的序号啊,对吧?或者那个number行号,行号大家知道,如果我排序之后行号是不是就是序号差不多对吧?啊,所以这个其实就是非常常用,也是可以扩展出很多实际应用功能的,在生产实际当中,聚合函数可以说是应用最广泛的一类函数,对吧?啊,就是我们解决这个问题的时候应用最广泛,当然前面的这些基本转换的话,我们往往是在。
13:00
就是一些不经意间就会用到啊,我们往往也不是专门去调用啊,这里需要给大家说的是table API里边现在还是比较局限的,就是有一些函数CQ里边已经支持了,特别是大家看这个rank number这些函数啊,这是当前的blink里边。就是新的这个阿里开开源出来的版本对吧,里边已经都支持了,但是呢,Table API这一块还不支持,所以有时候大家就是会发现整个这一套系统,你如果要写的话,Table API可能是你嵌在这个Java代码里边,做这个代码分析,流程分析更加的舒服一点,但是如果要是实现功能的话,还是直接写CQ实现的功能多对吧?啊,所以以后可能呃,Table API或许就会渐渐的让路给CQ啊啊这个也不好说,就看这个社区发展方向是什么样的啊,那你看这个QQAPI这里边,呃,我这里边是列了这个一个调这个求求这个数量值count和sum对吧,这跟上面是都能实现的一些基本聚合功能,这个还是没问题的,这里面有一个SUM0 sum0是什么意思呢?
14:09
SUM0是特殊的一种求和sum的这种操作,那大家知道sum的话,我们其实就是要看这个字段,所有的对应的那个值都要求和加起来,对吧,那假如说我当年这个字段里边就都没值呢,都是空,都是那怎么办呢?哎,那正常情况下sum是返回还是nu对吧?就相当于没值嘛,那所谓的sum姆零就是说假如都是空值的话,我认为求和得到的结果就是零,默认是个零对吧?啊,其实这个很简单,大家用一下就都知道,这就是关于我们系统内置函数的简单的一个分类介绍。
我来说两句