00:00
哎,我们来讲一下data stream跟表的一个转换,之前我们讲的这个,呃,怎么样注册一张表呢?哎,我们说是可以从外部系统里边直接连接外部系统,然后定义好它的那个stemma,定义好它的这个格式化的工具,然后就可以在表环境,表执行环境里边把这张表注册出来了啊,那接下来我们就可以,呃该该怎么用怎么用,对吧?你如果想用table API的话,再把它那个用env的那个from方法把它转换成tableable用就可以了,或者你如果只想用那个CQ的话,Flink cql执行的时候直接注册之后直接用啊,这个都是非常简单的。那我们还有另外一个问题,就是如果我们习惯的是这个流的处理方式,能不能把一个data stream转化成表呢?啊,当然是可以的,其实最初一开始我们写的那个简单事例就是这么做的,对吧?Data stream对于大家而言是更加熟悉的这种,呃,数据结构,所以呢。
01:00
比方说这里边有一个非常简单的转换啊,就是比方说我这里边定义了这个呃,Data stream是样例类类型sensor reading的话,那我如果想把这个流转换成表,就直接调用table env的from data frame方法,然后直接就转换成table了,对吧?啊,它这个并没有任何的那个STEM的定义,也没有格式化工具的定义,为什么呢?啊,因为我们这里边样例类嘛,当然这里边就是字段,该有的字段该有的那个结构都已经有了啊,然后这里边那个我们表里边字段的顺序,也就是按照当时定义这个样例类类型的时候,哎,一个一个的顺序,对吧,一一对应上就可以了啊,所以这个过程不需要任何的附加条件啊,这个过程非常简单啊,呃,那。这里边默认情况下是一一对应的,那我们也可以怎么样呢?也可以单独指定,比方说哎,这里边就是先是data stream对吧,然后后边我指定第一个字段ID对吧,第二个字段time Sam,第三个字段temperature,啊就这里边我们用的是跟那个,呃,就是在在这个样例类里边定义的是一模一样,那大家可能想到我能不能不一样呢?
02:16
哎,其实也是可以的啊,这里边就是把这个流转换成表,其实这个呃方式还是很灵活的,所以这个有时候在实际应用的时候啊,大家觉得如果是流式的那个读取数据源更舒服,更简单的话,你也可以就总是先读成流对吧,然后map成样一类,然后再做这个表的转换啊这个就是呃,看情况看情况啊呃弗link就是它的一个特点就是灵活嘛,快速灵巧啊,这个灵活就是也包括API里边能做的事情很多,另外一方面呢,也包括他的这种API的混搭啊,就是你这个各种各样的API都可以混在一起用,好那我们看看就是还可以怎么样来对应啊啊这里边就是呃。Data stream API里边的这个数据类型字段啊,跟表里边的这个sIgMa之间对应关系呢,有两种方式。
03:07
一种叫做基于字段名称的对应,另外还有一种叫做基于字段位置的对应啊,这就又来了,这就有点像我们之前看那个KBY的时候,对吧,你是传一个string指定名称,还是说传一个那个呃,Int的那个位置指定位置啊,这里边也是一样啊,两种方式,那我们首先看这个基于名称的这种方式。这种方式其实非常简单,就是后边啊,怎么样呢,把对应的那个名字拿出来,就是说这里边大家看啊,Time stamp,这就是什么,就是在那个sensor reading样例类里边指定的那个字段名。呃,必须跟它一模一样,你才能基于名称把它拿出来啊,大家看本来这个time STEM应该是第二位,第二个位置,对吧?大家看之前我们定义的时候,第一个ID如果要跟那个呃,本来那个样一类一一对应的话啊,应该是这个顺序,我们现在如果要基于名称去对应的话,那就无所谓了,对吧?呃,我是基于这个叫什么名的嘛,这个名字必须一样,但是位置就可以调啊,所以这有一个好处就是我可以打乱,就是按照自己的表的设计啊。
04:15
指定这个每个字段的顺序啊,比方说我把这个时间戳排在第一位对吧,我觉得这个时间比较重要,放在最前面,那这里边还可以怎么样呢?还可以重命名啊,就是如果我觉得这个这个名字太长了不舒服,对吧,我直接叫一个sts,这完全可以当成第一位的这个字段。然后这个ids y ID这可以啊,放在第二位对吧,放在第三位,这是基于名称的一个对应。然后基于位置的对应,那就更简单了,哎,那就是这里边我不需要这个指定字段的名字跟样例类里边的定义一模一样,而是怎么样呢?哎,我这里边呢,正常来讲就是不能一样对吧,因为不一样的话,如果一样的话,他可能会认为你这是基于名称去去匹配了。
05:03
这里边如果要是不一样的话,这里边它就会认为你这里是按照这个直接按照位置去对应的,那是怎么样呢?就是样例类里边的第一个字段对应过来,哎,叫做MYID表里边叫做MYID对吧?第二个字段叫做TS啊,哎,那大家看只有两个字段,那什么意思呢?Temperature不要了。对吧,大家看这就相当于直接帮我们把那个后面表操作的一个select,呃,映射那个对应的字段提取,把这个操作都给做了,哎,所以这个流到表的转换,这个还是就是功能很丰富的啊,大家如果想做,你想做位置的调整,想做这个提取某些字段,或者说想做这个重命名,这个都是可以去完成的。啊,那有些同学可能说那这个基于名称和基于位置,一般情况是用在什么地方呢?那像这个基于名称,呃,我我这边这个呃正常来讲可以去给他,就是比方说只提取某一些嘛,啊那那当然也是可以的,对吧,我这里边就是呃指定这个前面的time STEM和ID啊,然后直接指定两个字段后面time不要也是可以的。
06:13
啊,这里边大家需要注意的一个是具体使用的场景,一般情况下,如果我们已经卖成了样例类的话。那当然就是能用这个name就用name对吧,因为它更灵活,你这个按照位置的话,你这个就不能调位置了嘛,必须定死了,那什么时候基于位置用的会多一些呢。啊,大家可能会想到这个data stream里边的数据类型可未必都是样例类啊。假如说我没有包装成样例类,我就是一个元组,那怎么办呢?按照位置对吧?啊,或者我就是一个其他的这个基本数据类型,那怎么办呢?按照位置对吧?啊,就按照这个直接把它定义出来就完事了啊所以呃,这个就是大家在具体使用的时候啊,就是感觉怎么样方便怎么来就可以了。
07:01
这是这个把一个data stream转换成转,转换成表,然后大家需要注意的是,这个转换之后得到的就是一个table的对象,对吧?啊,就是一个table对象,那么。如果说我们还希望在表里边,就是环境里边去注册这张表的话,那你还需要,哎,调用一个,就是把table转换成一个,转换成一个我们注册进去的一个表,对吧?哎,所以还需要有这样的一步操作,所以接下来给大家讲的,那就是大家知道怎么样去转换这个呢?Create temporary对吧?之前我们在这个代码里边,在这个示例程序里边,也是做了这样一步操作,呃,这里是已经被弃用的,这个叫table,对吧?我们把这个助调可以再写一个。呃,Table env.create temp review对吧?这里边把它叫做data table,然后里边把这把这个data table引入啊,刚才大家看其实我直接传data stream也可以啊,所以这里边转换真的是非常灵活啊,就是你可以把data stream先转换成table。
08:11
啊,然后呢,Table再再注册对吧,注册成这个temple review也可以,怎么样呢?也可以直接就把一个data stream这个创建临时视图注册到环境里边啊,这个也是可以的,那这里面默认也是按照那个样例类的类型一一对应,对吧?因为我们说其实对于这个呃,Flink CQ和table API而言,我们注册的这个view啊,其实跟table是一样的,几乎大家认为这个就是完全一样啊,只不过就是一般情况用它来区分你中间转换的这个叫view,而直接连接外部系统啊,对应有那个实体表的那个叫table,对吧?啊,这个就是大家知道怎么回事就可以了啊,所以后面也可以比方说怎么样再跟一些字段啊,那就是我可以呃基于名称,基于位置来给它做一个指定,对吧?到底我要这个get stream这个流里边的哪些字段提取出来,转换成这个view?
09:08
啊,那另外一种是基于table对吧,把table直接转换过来啊,所以呃,这样如果要是一转换之后,我们就可以在这个CQ里边。去直接用这个表名from这个表吧,对吧。呃,那这里边还有一个给大家多提一句,就是有些代码里边可能会出现这种情况啊,就假如说我就是不想让他在这个呃里边去注册一个view,我就想直接写CQ,能不能写呢。其实也是可以的啊,那得怎么写这个CQ呢啊,那你就不能直接就是呃,在这里边把这个写到这个字符串里边了啊,就是把它要放在外面。什么意思呢?呃,其实是大家看啊,就是在在我们的这个table里边啊,我我给大家点进这个table里边来。然后这里边,呃,就是我们可以给大家看一下这个。
10:03
在这儿啊。呃,我们还是直接把这个写出来吧,就是我可以直接怎么写这个这个CQ query啊,我可以直接table env。点query。哎,这里面我可以直接写这个select ID temperature。然后from,诶注意from这里面后面不能,假如说我没有注册这个的话啊,我不能直接跟。这个data table,但是可以怎么样呢?在后边直接加上data table,然后做这个。呃,后面继续拼对吧,就当做它是一个表名where ID等于三一,哎这样也是完全可以的啊,这是为什么呢?啊,这其实就是因为我们在这里边啊,得到的这个就是假如说你在这里边把它跟字符串做一个拼接的话,那相当于是要先把它序列化的对吧?而它在序列化的时候,就是在这个flink后台会给就是在我们那个后台程序里边会把它自动的先注册一个temper review。
11:14
给他注册出来,同样名字的注册出来,所以相当于这个效率上来讲啊,跟我们这样去做是一样的,对吧,这个过程是一样的,只不过是他默默的帮我们又做了这么一步操作而已啊,所以看大家喜喜欢啊,你用什么样的方式做这个操作都是都是可以的啊,我们这里面一般情况还是你先注册出来,这个自己看得更清楚后,而且后边我们就可以直接写成这个字符串了,对吧,省得这么去做了啊,我把这个就先删掉了。好,这就是前面我们做各种各样的转换的这个过程。
我来说两句