00:00
接下来呢,我们再来给大家总结一下table和data STEM,也就是数据流之间的转换关系,因为对于这个表而言啊,它其实在我们的API里边是可以很方便的转换为data stream和data set的,所以说哎,我们其实定义的这个流处理或者批处理程序啊,就是你可以非常容易的。把它先转换成一张表,对吧,先读成表,然后呢,我们基于表去做这个CQ查询,或者说基于table API去做转换,然后得到的呢,再把它转回成流,或者这个data set数据集啊,其实这个是比较简单的啊,那这里面大家注意一下,就是转换的,转换成流的这种方式。主要是有两种模式,一种是追加流模式,另外一种是撤回流模式,大家看这是不是跟我们之前讲的那个。呃,当当时讲的那个更新模式是一模一样的,因为你要转换成硫,大家想我们的流是不是可以直接打印输出啊,可以直接在控制台看到对吧?所以这个里边你就得有对应的这个支持,你才能做这样的一个转换了,那这里边的转换方式就是一种是只在后面追加,另外一种就是可以表示撤回之前的一条数据,再去追加一条数据。
01:17
那大家想这里边我可以直接,呃,就是转换成流的话,我可以直接转换成一个up模式吗。插入更新模式可以吗?大家注意,这肯定不行,对吧,因为在流里边,我这个撤回模式可以加一个出false的字段,告诉后边的这个操作,我当前是要是要撤回就可以了,但是UPS的话,大家想想是不是我必须要指定K啊,你必须指定K,然后才能在之前输出的那个结果里边去找到对应的那个结果,那我现在是不是就没有办法我强行去指定K啊,我现在在流里边嘛,对吧,我当前并没有这样的一个特殊的功能,而且就是说流的话,大家想我这个流失查询是不是数据不停的来,然后这个结果也是不停的动态更新啊,那你说就是我前面已经输出过的那个结果已经在这个流里面已经传递到后边了,那我后面那个UPS,我怎么样去再改之前的那个内容呢?
02:16
是不是这就相当于我们这个流像水一样嘛,水就是泼出去的水对吧,那就收不回来了,所以这个流也是已经流动到下游的数据,你最多后边再来告诉他我要撤回,但是你不能告诉他我直接更新对吧?因为他已经出去了,我根本不知道他能不能更新啊,所以这是这个转换成流的这个特点啊,然后这里边大家注意一下,就是转换成流的时候,整体来讲非常简单,那就是如果是追加模式的话,就to a pen stream,然后把表写在第一个参数的位置,然后把当前的这个类型写在第二个位置,如果大家想简单一点的话,直接把它类型定义成肉就可以,对吧?那就所有的table,它的这个每一行数据都可以认为数据类型是肉,当然你如果复杂一点的话,你也可以直接。
03:06
就是直接定义一个元素类型对吧,比方说我定义成这个,呃,有一个TEMPLE2啊,前面是一个string,后面是一个double,这完全是可以的。啊,那另外就是如果说是撤回模式的话,我们就需要啊,就是相当于to tra stream对吧?这其实就是应用的,就是类似于我们之前的那个更新模式里边的撤回模式对不对啊,它更新模式里边我们指的是要朝外部系统发送这个撤回和这个更呃插入的消息,对吧?而我们现在指的是什么呢?是一个数据,是不是接下来就代表要返回,如果是,如果是更新的一个一个数据的话啊,是不是就代表我输出的这个流里边有两条输出啊,然后它前面要带着一个布尔类型的标志位,如果是true的话,表示的就是新增insert,如果是false的话就表示。
04:00
啊,表示这个是要撤回的,被删除的,对吧?那么一个新增一个撤回,两条合在一起是不是就能表示一次更新操作啊,诶,这就是我们说的这个,呃,两种不同的模式啊,撤回模式这个是把table转换成data stream,那接下来我们再看一下怎么样把一个data stream,一个流转换成表,这个也很简单,一开始我们第一个事例就给大家做过这样转换,是不是直接调1TABLE en的from data stream就可以了,对吧?直接从一个数据流里边直接把它读取出来就完事了,所以这个是特别简单的啊,这里面要给大家多说一句的是在这个。就是从一个流里边转换一张表的时候呢,还可以定义更多的参数,就可以后面追加什么呢。追加指定当前表里边的字段名称,诶大家看,比方说我可以直接指定ID,然后time s as ts,这表示什么?这是不是表示我可以把第二个字段叫做本来它是time Sam,对吧?我可以把它重命名成TS啊,因为大家知道在CQ里边time Sam其实也是关键字对吧?呃,这个我们不想在后面用这个字段,我就可以给它做一个重命名。
05:16
然后注意这里边我们是根据那个,呃,就是当前data dream里边是不是把它包成了ss reading这个port类型啊,这里边的字段跟这里边指定的这个名称是不是要一一对应,这就必须要一个对一个对吧,直接指定出来就没问题了啊,那然后后边还有一个就是怎么样去创建一个临时视图呢?哎,这就涉及到几种不同的方式啊,我可以直接基于一个流data stream去创建临时视图,那家看这个创建临时视图是不是就跟创建前面我们讲讲那个从一个data stream去转换成一张表是一样的呀。大家看这个过程是不是完全一样。啊,对吧,直接就是create temporary view,然后后边给一个当前的这个view的名称,接下来是不是把这个流传进来啊,只不过就是相当于我这儿这个就大家看前面你要对比的话,我这是from data stream,然后只给这个流得到一张表就行了,而这里边呢,这相当于是create temporary view,这是不是在环境里面注册了一张表啊。
06:19
不是得到一个table类型,而是在环境里边注册了一张表啊,然后把这个流传进来就行了,那或者我也可以在后面再追加一个当前对应的那个字段,对吧?把流里边的那个数据类型啊,Po类型每个字段都对应过来啊,那另外还有就是我可以基于一张表去创建一个view,那大家看这个创建的过程是不是跟这个也很类似。就是create temporary view,然后给一个view的名称,后面给的是表名,对吧。啊,所以现在大家如果简单的总结一下的话,我们可以怎么样,首先啊,创建表有有两种含义,一个是在当前的这个环境里边注册一张表。
07:02
这个大家知道对吧?哎,那注册表的这种方式有几种啊。首先最最直直接的一种是不是我们直接在之前这个connect的时候,把当前的这个这个表啊,Connect调connect的方法,连接器传进来啊,描述器传进来后边create temporary table啊,这样是不是注册了一张表啊,然后后面如果table API要用的话,是不是还得from再把它读出来啊,这个才可以去去读出这张表啊,这是注册了一张表,那另外还可以怎么样呢?大家想后面如果我对还可以,是不是直接用这个DDL直接在这里面create,把这个写出来,这是不是也相当于是在环境里面注册了一张表啊,这张表名就就在这儿对吧?Create table的时候注册出来的啊,这是两种这个注册表的方法,然后呢,后边如果说我们想要,假如说啊,我现在已经就有一个这个table了,就这里边有一个这个table类型了,但是呢,对应的那个表我没有注册,注册在里边,没有注册在这个环境里边,那怎么办呢?
08:08
那我是不是就可以把这张表?转换成一个temper review啊,大家想是不是这个注册了之后,因为我们说在link里面,反正都在内存里嘛,表和view是不是差不多啊,所以接下来我是不是写C口的时候就直接可以用这个来写了。之前你如果要只有table这个sensor table的时候写C是不是不能用了。注册之后就可以用了,对吧?啊,所以这是这个就是关于我们这个注册表啊,注册view的几种方法,那生成这个table类型有几种方法呢。大家看到这就是可以从流里边直接转换对吧?另外是不是还可以直接注册之后,在环境里面注册之后,然后even env直接from啊,直接from读读取出来,是不是这也是一张表,另外就是中间我们的所有基于table API,或者说做了一个CQ query做查询之后得到结果是不是也都是一张表啊,哎,这个总结一下的话,就是有这么几种不同的转换的过程啊,可能稍微会有一些有些乱,有些复杂,大家可能下来之后要稍微的再总结一下。
09:15
啊,那最后还有一个就是我们可以查看执行计划,这个也很简单,就是可以直接调table env的一个plan这个方法,然后把一张表传进去,就可以看到当前这张表的执行计划了,啊这就是关于这个表这一部分的操作和转换。
我来说两句