00:00
特给大家实现的这个输出到文件系统里边的这个代码,我们发现只能够把这个就是仅仅追加式的这种这种表输出到文件,也就是说这里边不能做聚合操作,因为一旦要做聚合操作的话,随着数据的啊继续流进来,那这里边我们的聚合结果会改变,对吧?啊,这种聚合操作导致结果结果表里面有改变,它就不能直接输出到这个警示追加的这个流式的table s上,像这个文件就不能直接输出,或者之前我们那个控制台直接print打印的话,呃,就是to aend stream的话,那就不能直接转换,对吧,必须要to retra stream才可以转换。这里边涉及到一个非常有意思的问题,就是对于这个,呃,就是在这个flink的这个流处理里边啊,我们如果把它转换成表的话,这里面其实涉及到一个问题,就是你对表我们是有增删改查这些操作的。
01:01
如果你要是说查询这个不用说啊,因为对他数据没有没有改变,对吧,只是查一下,那假如说我们当前的这个表操作是要插入啊,那这个也简单,我就在后面追加嘛,后面如果要改成流的话,大家想到这个也也就是很顺理成章的这个流后面再多一条数据输出就完了。但是如果要有改或者删除这样操作的话,在我们这个流和表的转换过程当中,这个就会很麻烦,因为我们当前的这个table API和CQ底层都是处理对吧,都是stream这一套处理的方式,我们现在还是一个流处理程序,只是用了表的形式而已而已啊,但是这种用了表的形式之后,就会发现它确实要再往出输出的时候不好做啊,那这就涉及到了一个所谓的。更新模式啊,给大家讲一讲这个更新模式又是一个什么样的概念啊,对于这个。流式查询啊,大家知道我必须要声明,就是怎么样在表和外部的这个连接器之间我们执行转换对吧?啊,就是表和外部连接器之间,我们要把这个数据想要写进去的话,并不是说这个表的数据我刷一下子把它全写进去就完了。
02:19
因为我当前是流式处理,是随着这个数据不停的来,这个表里边的状态是要改变的啊,就是我们前面说的啊,假如说当前这张表你就是这个流嘛,来了数据之后就是来一条增一呃加一行,来一条加一行,如果就是这样追加的话,那这个就很简单,但假如说这个表做了转换之后,它的特点是。你后面来一条数据之后,我是更新一下表里面的某条数据,对吧,我要把它不停的做更改,那你到时候把这张表的数据直接往流里边输出,这就不对嘛,对吧?啊,这个你相当于是得告诉外部系统,我现在是一个更新操作,而不是来了一条新的数据,不是简简单单来了一条新的数据。
03:07
哎,所以这里边一个核心问题就在于我需要跟外部系统交换消息类型,就是说我得告诉外部系统,诶,我当前是追加了一条数据对吧?呃,你你直接那个呃在在后面那个追加就可以了,或者说我得告诉外部系统,我现在不是啊,我现在是呃呃更改了一条数据,对吧?你得把之前我的那条数据找到啊,然后把对应的现在新的数给它写进去。所以这里边的这个消息类型呢,就是由所谓的更新模式来指定的。啊,那这里边有什么样的更新模式呢?啊,给大家稍微的讲一下,主要是这么三种更新模式,最简单的就是追加啊,Pad模式啊pad模式这个就非常简单了,就是呃,相当于就是说我们只是往这个表后面追加嘛,所以这个表我们就是内部的这个表啊,跟外部系统它交换的消息类型就只有什么呢?只有追加就是插入的这个消息,这个消息类型就叫insert,对吧。
04:12
啊,所以就是说我每次跟外部系统发消息的时候,都是告诉他说,诶,当前数据是这个,然后insert对吧,当前数据是这个insert,所以外部就是拿到一条追加一条,拿到一条追加一条,这当然就没问题啊,这是这个追加模式。像我们前面讲到的这个,呃,To a stream,或者说是这个直接往文件系统里面写入,都是用的这种模式。那我们再看看,那假如说对于这种情况而言,就是我们表里边的这个增删改查嘛,增。可以搞定,那如果要是删除更改呢,查我们不考虑了,对吧,主要说这个呃增删改,那么删除和更改操作用这个你只是一个insert消息,这就这就没办法了,对吧,因为你后边如果要是说又有一个更改操作的话,你只能是把这个更改的,比方说之前的数据和呃之后新的数据发送给这个呃就是我们外部系统,但是外部系统都认为你这是插入啊,他所有的都往后插,他不会去更改。
05:14
啊,所以这个就没办法了啊,所以呃,我们这里边就有另外一种模式叫做撤回模式啊,这就是之前我们说的to retract stream,对吧,它的模式就叫撤回tract。那这个特点是什么呢?它是跟外部系统可以交换两种信息。一种呢是添加叫做ADD信息,那其实这个ADD跟我们前面说的那个insert一个意思,对吧,你是插入还是添加一个意思嘛,那另外还有一条消息叫做retract撤回,就是说诶之前我的某一条数据现在不能用了,对吧,现在我要把它撤回,说明它是失效的一条信息,或者说它是一个老数据,现在要更新了。所以现在我能给外部系统发这样的两种信息,那如果是一个增,就是增的操作,如果要是音色操作的话,那发一个什么呢?啊,发一条数据,要增加的数据对吧,然后说这是一个ADD的消息。
06:11
啊,那外部系统收到之后就知道了,好艾直接追加到后面对吧?啊,这个比较简单,插入进去,那如果要删除一条信息怎么办呢?删除一条数据怎么办呢?那就要给外部系统发一个delete消息,对吧?呃,就是发发一个retract的消息,Retract的消息,然后带着一条数据,那就是告诉外部系统收到之后就知道了,哦,这条数据要被回收了,那就是要被删了嘛,对吧,从表里边删掉了,相当于。那另外还有一个是更新操作,更新操作比较麻烦。对于外部系统而言呢,他要给他发送一条retract和一条APP啊,所以这个更新相当于是啥意思哈,就是我之前这个不是已经这个341有一个一写进去了吗?现在如果341变成了二的话,哎,那我相当于我这个操作不是直接改这个数,改成改成二对吧,我相当于是先把它删掉,然后再插一条312对吧,之前这个是311对吧?诶这是这样的一个过程,所以对于外部系统而言,他收到的是什么呢?就是收到的是S411,上一条信息的retract和下一条信息312的APP,也就是说之前那条信息过期了,作废了,现在我要写入的是当前这个新的信息。
07:33
这就是retra模式,所以大家看到那个为什么我们在这个控制台输出的时候支持了这个retra模式呢?它就是在前面加了一个字段true或者false,对吧,表示当前这是新的数据还是说是老数据要回收的数据,通过这种方式把它区分开了啊,这是这个retra模式。大家会发现这个re retra模式呢,比较容易实现对吧,比较容易,这个呃,就是做到,就像我们那个控制台,只要加上一个字段就可以搞定了,但是它有一个问题啊,它有一个问题就是你外部系统像我们控制台为什么直接做到了呢?就是控制台你只要显示出来,人自然看到了之后就知道,哦,哪条信息是老的对吧,回收了哪条信息是新增的,但是你如果写入外部系统,你想我写入到文件里边去的时候,文件怎么能知道你给一条这个true或者false,我就知道它是它是老的,我就能查到把那个更新掉了呢?这个对于文件系统来讲太困难了,对吧。
08:35
啊,所以说你不能通过这样一条消息,就让文件去自动去查这个数据到底是哪个把它更新掉,所以如果要是这样的文,就是外部系统的话,那他就没办法对吧,他就只能是在后面追加,你不能应用这个rere模式。好,那这个re模式看起来还是不错的啊,至少实现了我们这个增删改的所有功能,那它有没有什么问题呢?它的问题其实非常明显,就是作为一个更新操作。
09:03
我们在这个做了聚合对吧,做了这个表的转换之后,可能非常非常频繁,每一次更新操作它都要发两条数据,大家看到了对吧,我们前面那个流里边to stream,你来一个,前面来一个数据,本来你只要输出一个更新结果就可以了,它结果它是每来一个就输出两条数据,一个false,一个处。哎,所以这个效率上其实是比较低下的。那有有没有效率更高的这种更新模式呢?有哎,那就是最后一种叫做UPS模式,UPS模式就是所谓的更新插入对吧,那就是updates,就是这个没有单独这个单词啊,它其实就是update加insert啊,合并在一起的一个操作,那所以它里边也是有两种消息,一种消息叫absur。另外一种消息是delete对吧,那delete大家可以类比那个retra删除嘛,删除一条消息,那对于这个更新和插入啊,增和改两种操作,呃,最后他其实都是一样的,发一个UPS消息。
10:07
哎,所以这个相当于我们就是呃,通通的每一条消息啊,每一次操作只发一个消息,如果说诶我发的要做一个删除操作的话,那就是一条数据,然后跟上一个delete的消息,对吧?指定这是delete的消息,那我们外部系统收到之后,哦,这条数据要删掉了,我就删掉,如果他能做的话,他就删对吧,像文件系统他做不到,他就他就删不了啊,那还有就是如果要来一个up消息的话,注意。这里边所有的数据来了之后都是up消息,那外部系统怎么知道该更新还是该插入呢?所以对于这种模式,外部系统就一定要能够指定一个K对吧?大家想这就必须是那个k value的这这种方式你必须得指定这个唯一的K,然后呢,呃,这里边你的消息里边当然要带着这个,只要他来了,那就是外部系统一看这个K有没有呢?我去查对吧,如果要是已经有了,那我就是更新update,如果要是没有,哎,那就insert对吧,这就像我们那个呃之前的那种往那个MYSQL或者说这个。
11:18
其他的这个数据库里边插入数据的时候,判断那个key的那种那种方式一样啊啊所以呃,这个更新插入模式up模式呢,这个就要求外部系统的支持要更多对吧,它尽管是更简洁了,问题就在于你得支持才行啊啊就像我们那个文件系统,它连那个撤回都支持不了,对吧,只能是往后追加啊,那就没有办法。所以具体我们流式输出啊,写入到哪些外部系统,到底应用什么样的模式,还得看外部系统的支持程度。啊,这是这个更新模式这一部分。
我来说两句