00:00
接下来我们再讲另外一个比较重要的内容,那就是table API和flink CQ里边的函数啊,那大家知道这个高级API嘛,高级API最主要的特点其实就是调用起来很多功能非常简单,对吧,有现成的库,现成的方法,直接一调就可以实现需求,所以说函数这一部分本身对于这个底层data API而言啊,其实没有这样一个概念的,我们大部分那个呃,能使用的那个函数类,大家看都是跟当时API的那个算子完全绑定在一起的,几乎就是一个对应一个啊,Map对应一个map function filter对应一个filter function啊,Process对应当然有很多种function啊,几乎都是这样跟算子对应在一起的,而这里在这个table API和CQ里边啊。呃,那这里边定义的函数这就多多了,它更加注重的是功能上的实现,而并不是啊,就是针对我们某个算子啊,里边传一个函数类这样的一个概念了,这就是我们真正意义上大家理解的那个函数啊,这就不是一个类了啊,所以我们看一下flink table API和CQ呢,为用户提供了一组可以用于数据转换的内置函数啊,所以这里边其实就是直接可以进行数据的转换。
01:19
传一个参数得到一个新的结果,而不仅仅是啊,就是一个函数类对吧?啊,这里边是这个是真正意义上的方式啊呃,那对于CQ里边支持的很多函数。目前table API和CQ啊,特别是合并这个blink版本之后啊,里边都已经做了实现,都已经支持了,当然说的就是很多都已经支持,也就是还有一些还还不支持,对吧?啊,所以有不少还处在这个快速的开发扩展当中啊,大家可以继续关注后续flink新版本的发布,可能这一部分会越来越完善。那对于现在还不支持的函数,如果大家要是非要想就是用table API做这个功能的话,能不能呢?呃,其实也可以的,所以对于flink table API里边的函数啊,两大类,一类就是系统内置函数,另外一类就是啊,可以用户自定义,对吧?你这个目前还不支持的这些需求自己去写嘛,这其实也跟底层的这个data stream API的那种方式差不多了,对吧?那种方式大多数都是我们看起来就是自己实现一个自定义的函数类嘛,啊,那其实就是自定义的方式了。
02:33
啊,所以接下来我们就看看这个函数到底有哪些功能,首先我们得熟悉一下,大概的知道啊,Table API和flink CQ提供了哪些系统内置的函数啊,这里边主要分这么几大类,呃,因为这个提供的函数功能已经很多了,所以我们这里边呢,只能是截取一些有代表性的放在这里,大家用到什么到官网上面直接去查就可以。好,我们先看一下啊,首先有一最基本的比较函数啊,但是大家知道这个很简单,就是呃,大于等于小于对吧,大于呃这个这个各种各样的这个比较嘛,关系比较,那CQ里边的写法非常简单,两个值,哎,相等的话用等号连接,呃大于小于的话连接对吧,直接连接就完了,那table API的里边的调法呢,稍微大家要注意一下,前面我们也提到了,就是如果你用了那个字段那个expression表达式的话,它的相等得用三等号。
03:29
对吧,啊,这个稍微的奇怪一点啊,啊,这个因为它是table API是内嵌在Java或者拉语言里的嘛,双等号那个是已经有定义了,对吧,或者是单个的等号已经有定义了,所以这里边我们得再多加一个定义三等号。啊,那所以大于小于还是一样的这个写法啊,如果要是说这个就是大于等于或者小于等于的话,大家也要注意一下,那得是一个大于后面跟两个等于号对吧?啊,这个就是,呃,稍微注意一下它的用法就可以。
04:03
然后还有一大类是这个逻辑函数,逻辑函数也很简单,就是返回的是一个布尔类型的变量,对吧,逻辑逻辑值逻辑判断true false,然后那CQ里边的话,那肯定就是,其实知道大部分的这个逻辑判断不就是与或非吗?啊,那你比方说这个就是一个布尔类型的值,然后on另外一个布尔类型的值啊,这就是货的关系对吧?嗯,那如果你要与的关系的话,就and嘛,对吧,如果要是说呃,这里边直接判断某个值,它我们要就是相当于非这个值非的那个表达式的话。如果它是true,我们这里边要得到一个false,对吧,如果要是false,要得到一个处,那那有两种形式,一种是判断它is false,大家看这个表达式啊,就是说判断它是为假为为false,也就是说如果它是真的话,本来这个布尔类型值是真的话。诶,那它为false,那最后判断就是false对吧,如果是真就变成假了,如果它本身是false是假的话,那false is false那就变成真了,对吧?所以就相当于是给它做了一个非的这个转换。
05:10
啊,那另外还有一个更简单更直观的飞,那就是not了啊,Not这个波尔类型当然就是对它取飞,这里要给大家稍微解释一下,这两个有什么区别啊,啊就是如果说你用了这个is false这个表达式的话,我们知道在这个CQ或者是table API里面,有时候这个类型它可能是unknown对吧?啊就是就是本身是一个不知道类型的一个状态,那这个时候如果说你掉了这个。就是它判断它is false的话,那返回也是false对吧,No这个结果相当于也是假的啊,所以也会返回false,但如果要是你直接not这个。对应的这个表达式的话,那unknown返回的也是unknown啊,就一些一些这个细节点,他们的这个不一样,大家具体的话就是用到什么再去看就可以了啊,那它对应着这个table API里面的实现啊,那就是这里边我们就得是语言里边的那种写法了,因为它是内嵌在Java语言和skyla语言的嘛,啊,所以如果是或的话,我们用这个或逻辑或啊语的话,用逻辑语对吧,如果是非的话,哎,逻辑非感叹号,或者可以调一个方法叫点is false啊,这跟上面这个is false是一个意思啊。
06:21
啊,大家看就是几乎我们这里面就是每一个CQ对应的这个方法啊,这个函数在table API里边都有它的对应实现啊,当然后面大家会看到,就是现在来讲啊,CQ flink CQ本身支持的方法要比table API要多一些。啊,因为大家知道这个CQ本身我们内嵌是有一个k set那个,呃,CQ引擎的嘛,啊,所以说本身CQ里边能写的这个方法,这里边迁移过来相对来讲是比较简单的,但是table table API的话,它又要内嵌到语言里边,这个稍微麻烦一点啊,所以现在还开发的程度是CQ要超前一点,支持的东西更多一些。
07:02
啊,那这里面还有一大类就是算术函数了,这个也很简单啊,做计算嘛,数值计算我们这个,呃,一个数加另外一个数,这不就是求和嘛,对吧?啊,这个在table API里面一样,对吧?也是这样,那如果要是CQ里边,比方说我们这power这个算那个幂运算几次方的话,那也是两个数作为参数传到这个里边来,对吧?那所不同的table API里面的调调用方式是它是得用一个值,然后点power这样去调用对吧?它总是基于一个值调这个值的方法构成一个表达式,而在这个CQ里边的话,直接就是大家更熟悉的这个函数调用的这种方式。其他的一些算术函数还非常非常多,对吧,这个一想就能想到啊,大家下去之后可以具体再看。好,除了这些简单函数之外,还有一些稍微复杂一些的函数啊,那给大家举几个例子啊,几大类一个字符串函数啊,那这个其实说是复杂,它只是实现的功能多一些而已,很好理解,比方说这个一个字符串,诶后面我们做这个一个一个像或一样的运算,然后或另外一个字符串啊,这是做字符串连接嘛,所以对于这个table API而言呢,你直接就加起来不就完了嘛,这不是Java语法支持的嘛啊所以呃,这个就非常简单,然后呢,后边这个,呃,这个upper,这当然就是转转换成大写对吧?你如果要是在做这个table API的时候,那得用调这个string,点它的upper case方法。
08:30
它转换成大写,所以大,但这个风格就都是这样啊,我们这边CCQ这边的直接写好像是一个函数名里边传参,而这里边呢,都是基于某个值去调用它的一个类方法一样的这种感觉对吧?呃,那呃后边这里边是这个叉lengths,这是字符串长度了,对应的这个呃,Table API里边那其实是当前一个string调查的查方法。啊,所以基本上都是这样对应的这个关系。后边还有一大类叫时间函数啊,这就是跟时间操作相关,之前我们在讲到那个时间特性啊,时间属性的时候,其实有一些也已经用过啊,比如说这里边time stamp对吧?啊这这里就是你如果要是说这个是把当前一个string啊标准格式,那应该是这个就是年月日啊,也就是YYYYMM,呃,DD对吧?呃,然后后边应该是这个,呃,就十分你如果要转换这个。
09:27
STEM时间戳的话,后面还应该有HMMSS对吧?十分秒年月日十分秒这样的格式,这样的一个string都可以直接转换,转换成一个date啊,就是在CQ里边的日期格式啊,它得到的就是一个CQ的date类型啊,那或者说这个转换成CQ里边的time time时间戳类型,对吧?啊,那或者还可以current time,这是获取当前的时间嘛,当前的cql time啊,然后下面还有这个interval,诶,前面我们也见过了,在定义那个窗口的时候,大家记得那个呃,Tbo或者是ho对吧?在CQ里面定义的时候,它一定要传一个,传的那个窗口长度,我们是用inter去定义的。
10:10
所以就是interval,哎,这个string就是大小了,对吧,引号引起来INTERVAL10,然后再看的啊,这就是十秒。所以我们只要是遇到CQ里边的时间表达的时候,基本上都是这种写法啊啊,就是之前我们看的那个interval。然后后边。哎,这个引号引起来对吧,十啊秒。或者这里是second,我们可以是minute对吧,Day这些都是可以的啊啊,那对应着这个table API里边的用法的话,呃,那同同样也是,它是当前的这个值string,我要调to date对吧?这就转换成date或者two time step,这就转换成time step,最后的得到的结果类型都是一样的。那或者是直接调current time对吧?啊,这是看起来这是一个Java里边的方法,或者是SKY里边的方法一样啊,那另外如果要是涉及到我们这里的这个就是interval啊,时间间隔这里面怎么表示呢?啊,就是一个数字,然后点days,就是之前我们看到它怎么表示这样对吧。
11:15
十点。A。这样去写啊,之前我们在那个table API里边定义滚动窗口的时候,不就是这种写法吗?啊,所以这是table API的一个一个特点啊。然后我们再给大家呃,看一下这个最后一个就是聚合函数了,聚合函数大家其实比较关心的,因为我们一般情况用它来讲的话,你这些单个值的这种转换,这些其实我可能引入一个别的包,对吧,这些都都能够搞定,或者甚至我自己去写函数也非常容易,但是这个聚合函数可能稍微麻烦一点了啊,那当前这个呃,Flink CQ里边,其实在CQ里边主要的一些聚合函数,现在基本上也都已经支持了。
12:00
啊,那就像这个count sum对吧?啊,Max这些基本的这些东西都支持啊,啊另外这个还有rank room number,像这样的也是支持的啊,比方说这个rank就是说聚合之后的排名对吧?啊排序之后排名,然后roll number的话,那就是聚合之后它排第几那个行号啊其实所以这两个其实有点像啊,就是我们可以去直接输出它的排名,也可以去得到当前的那个road number。这里要稍微注意一下,就是对应我们这个count,如果要去做计算的时候,我们table API里边就是当前的一个一个field啊,一个字段一个列,直接去点。com就可以啊,那如果要是sum的话,直接点sum就可以啊,这里大家看到有一个这个SUM0对吧?啊SUM0的意思,它其实跟那个sum本身是一样的,只不过就是说如果。那个所有值都是空的,没有值的话,它要返回一个零,对吧?啊就是如果说那个sum。你直接调的是那个sum的话,所有值是空,它返回还是闹还是空,这里边是如果所有值是空的话,它返回保证结果不不为空,对吧,如果没没数的话,返回一个零啊。
13:09
这个特点啊,注意table API里边现在还不支持rank和这样的一个写法。啊,所以这里面大家就知道了,这个可能在实现一些需求的时候,就table API就受限比较大,对吧?啊,能做的事情就比较少一些了,那可能就是用CQ,呃,相相对来讲能够做的需求更多。啊,这就是这一部分内容。
我来说两句