00:00
接下来啊,我们继续看后面的内容,呃,有一个比较有用的一个功能是什么呢?是我们在table API里边可以去直接查看当前的执行计划啊,这主要说的是,呃,就在内部啊,Table API和这个flink CQ大家知道肯定是有一套机制来解析我们定义出来的这个表的处理逻辑,然后诶,我们要生成那个执行计划,然后还要去做一些优化的,对吧?哎,整个就是我们所说的这个数据库访问的时候不是有这个access plan嘛,啊这些我们都是要去做解析生成,然后去做做优化,那同样在这一个当前,呃,就是这个flink CQ和这个table API里边也是有这样的一套机制的,那我们可以通过table environment点直接调它的plan,然后把table作为参数传进去调这个方法,哎,就直接可以查看当前的这个执行计划,或者说呢,哎,我直接。
01:00
呃,就是把这个table直接也不传,直接调explain方法,它就相当于是直接把我们当前这个处理程序里边的所有的这个执行计划都列出来,对吧?呃,就是返回,它会返回一个字符串,然后会描述三个计划,哪三个计划呢?呃,首先就是我们呃要去做这个优化的这个逻辑查询计划,就是我们的那个access plan对吧?啊,就是整个这个关系型数据库最后都会优化出来一个这个查询计划嘛,啊那呃,首先是先把这个原始的这个先列出来,然后呢,哎,把那个优化之后的也列出来,对吧?最终我们优化之后是什么样的,最后还有一个实际执行的计划是什么样的,这个大家可以类比,就是我们在做data stream API做那个分析的时候,有那个执行图对吧?啊,Join manager会把这个东西解析出来,最后发给task manager去做最终的那个执行,啊,那这里边我们的这个执行计划呢,它是比较高层级的,就是基于这个table。
02:00
就像我们之前的那个,呃,CQ关系模型里边的那种执行计划对吧?表的那种访问计划,所以说在这个层级把它解析出来,那我们知道最底层啊,特别是现在这个blink版本底层都已经是STEM流处理的这一套API了,那大家就知道了,最终当前的这个执行计划还是要在解析转换成我们流处理的那个执行图再去做操作的,对吧?啊,所以这个其实是差不多类似的东西啊啊,那最后你就是我们可以先把这个它是个字符串嘛,String先获取到,然后直接把它打印输出,你就可以看到这个执行计划了啊这个比较简单,下来之后大家可以自己试一下,看一看就知道了啊呃,然后接下来呢,我们要给大家再详细的说一说流处理里边的一些特殊概念,那首先呢,我们要从整体上对比一下流处理和关系代数的一个区别啊,那这这里面其实就是说什么。
03:00
那关系代数呢?啊,就是我们说的这个关系型数据库对吧?关系型表,然后里边我们要做的这个CQ查询操作,连表查询,整个的这一套操作,在数学上,数学上定义的话就叫做关系代数啊,那那我们要把它跟这个流处里来做一个对比,首先我们从这么几个维度来判断啊,啊首先我们看这个就是处理的这个数据对象啊,大家看这个关系型,关系型数据库啊,或者说关系型表要做的操作,我们想这个table apiicq,对吧?操作的都是这种关系型的,呃,表表结构,他要处理的数据对象是什么呢?其实就是字段元组的一个有界集合,对吧,我要去执行一条CQ,那肯定就是说当前的这个表数据都已经在这儿了,它就是有限的,有借的对吧,放在这儿不动的,我一条CQ执行完了之后,得到的结果肯定也是就是确定的一个结果对不对,哎,所以。
04:00
这就代表后面接下来就有查询操作,对数据访问的,我可以访问到当前的全量数据,然后去做计算,哎,最后生成一个固定大小的结果集,对吧?然后就终止了,最后查询终止是有一个条件,就是查询完成得到最后的结果集,最后就停止了,非常简单,这就是我们熟悉的这种CQ操作啊,那大家想一想,对于这种关系代数的操作,这其实是什么呀?这不就是批处理吗?对吧?有借的结合,然后哎,整体的去访问到所有的数据,得到最后一个结果,直接退出,出出一个结果就完事了,这不就是批处理有借有借流的这种处理方式嘛,对吧?啊,那所以对于流处理而言,与之对应的,大家想想真正的流处理是什么呢?数据字段应该是无限的,对吧,那就不停的来,不停的来,那当然了,这里边我们也可以认为关系音表。
05:00
数据,呃,这个表里边的每一行数据,每一个字段组成那个元组,现在就是我们流处理里边的,你包装成样例类也好,说元组类型也好,就是一个一个的字段,对吧?哎,都是这个字段元组,但是现在是无限的一条一条不停的来,然后后边做这个查询访问的时候呢,哎,大家想一想,那我当前的一次查询访问的话,那是不是就只能是就不可能访访问到所有数据,对吧,只能是访问到当前已经有的啊,就是当前最新的这条数据,以及以前已经来过的所有数据,这个我是可以获取到的,对吧?哎,那所以接下来呢,我当前这个是就不应该停止啊,对吧?我如果要针对这个流去做一个查询的话,你就不能停着,应该是不停的等新的这个数据输入,然后呢,不停的基于新数据输入之后,当前的所有数据继续去做查询,对吧,不停的做持续的查询。
06:00
然后不停的更新当前的查询结果,所以大家看到其实流处理跟这个关系代数啊,就是跟这个CQ应用的场景其实是有本质不同的,CQ这种用法它本身就是最适合于批处理场景的,这也是为什么这个flink啊,在做这一个使用的过程当中,大家会觉得一开始上手啊,做这个流式转换,做流式计算的时候比较难以理解,因为跟大家熟悉的这种CQL操作完全不同嘛,而且你会看到就是我们在定义table API和CQ的时候很复杂对吧,里边涉及到流跟批处理做这个CQ查询的一个本质的区别,质的不同啊。那所以接下来我们就要给大家说一说,既然这个CQ本身应该是针对P处理的,这跟流处理天生有隔阂啊,那怎么办呢?到底是table API和弗Li CQ,怎么样去做这个流处理操作呢?哎。
07:00
这里边就要提出一个重要的概念,就是下边我们要讲到的动态表。
我来说两句