00:00
我们知道了怎么样把数据流转换成动态表,然后执行CQ去进行持续查询,那我们知道在整个的处理过程当中,本质上还是流处理嘛,我们所说的这个动态表只不过是table API和Li CQ给我们包装起来的一个上层的API而已,所以本质上最后得到的结果还应该是一个流,诶,那我们得到最后的这一个动态表应该是一个什么样的流呢?其实非常简单,我们就会发现,如果是一个仅有插入操作的。追加查询的话,诶,那么得到的动态表很明显就可以直接转换成一条一条插入的数据嘛,那接下来我把这一条一条的插入数据再拆开,一次一次的输出,这不就是一个最经典的流逝数据的样子吗?而如果说我们当前是一个更新查询的话,有更新操作,那怎么办呢?诶,那自然就想到了我最后输出的这个流,那就不要输出当前的每一条。
01:05
数据,而是把当前的更新日志流lo。去做一个完整的输出,也就是当前你是修改了哪一条数据啊,或者说是把这个数据进行了删掉了哪一条老数据,增加了哪一条新数据,完成完整的这个更新操作流程都要显示出来,这样的话就转换成了真正意义上的数据流。所以我们也就看到了之前在代码里边出lo stream,它最后显示出来的前面会有一个比较特殊的符号,我们说那是一个roll的简写,就是加I或者减U加U这样的一个符号,这就是表示当前的流里边的更新操作。啊,所以这里边我们还会涉及到一个所谓的。更新日志流的编码方式,哎,那什么叫做编码方式呢?这个主要是考虑到我们最后得到的结果,这样一个流是要跟外部系统做交互的,我们知道最后是一个SK任务,那一般情况可能需要把它比方说写入到外部文件系统,或者说写入到各种各样的数据库里,写入到卡夫卡,写MYQ写入写入到或者h have等等等等,那所以在这个过程当中,我们肯定不能说当前。
02:26
做了一个更新操作啊,当前这个A原来是一,诶,然后接下来又来了一条数据之后A改成二,我就直接把这个A2。发给外面的数据库,那外面数据库并不知道你当前这个AR到底是要干什么呀,你是在数据库里边做了一个插入,还是要做一次更新,还是要做一个其他的操作呢?诶,所以我们会发现啊,当前的动态表既然里边它跟关系型数据库表一样啊,可以做各种各样的所谓的I啊,就是各种各种插入更新的操作进行的更改,那么做完更改之后的得到这个我们如果要写入外部系统的话,那也需要把所做的这些操作全部告诉外部系统。
03:14
哎,那所以就是我们不能只传数据,还要告诉当前数据所执行的操作,这就是我们所说的更新日志,更新日志可以进行不同的编码方式啊,那之前我们说最常见的,这不就是你要不就是加I,然后减U,加U不就是这样的一个编码吗?呃,其实我们还可以有其他的一种方式,这里做一个系统的说明。首先最简单的当然就是针对所谓的颈椎加流了end stream,什么叫end stream?这其实跟我们之前所说的经过。只有插入操作的追加查询得到的动态表是一致的,我们知道如果要是经过了一个追加查询,只有插入操作,那得到动态表它就是不停增长,里边只有加I插入数据的这样的一个过程,所以转换过来的流,那就相当于也是一个一个往后追加就行了嘛。
04:17
诶,那所以这样的流就叫做颈椎加流,这个流发出的数据,其实那就是动态表里边每增加一行,我就发出一个数据啊,那看起来就跟我们的常规的流处理是完全一样的。那另外还有一大类,那就是我们说的,那假如说这个动态表,结果动态表里边不光有插入操作,还有更新操作怎么办呢?啊,那如果有update操作的话,那我们就把它表示成一个编码成一个撤回流,所谓的撤回流就是里边要包含两类信息,一类信息叫做添加。另外一类信息叫做撤回retract啊,简单说的话呢,当然就是ADD,那很明显那就是插入嘛,Insert嘛啊,就是我们说的要追加增加一条数据那。
05:09
Retra撤回呢,撤回我们知道就跟删除一样嘛,所以就有一个delete这样一个操作,可以直接编码为retra啊对于这个一个数据库而言,我们知道就是增删改查,增删改查查询我们这个不说了,那是前面我们讲解的这个持续查询,不涉及到表的改变,那涉及到表的改变的其实就是增删改,那增删改三种操作。如果说都能发生的话,在这个撤回流里边分别怎么表示呢?那如果是增插入操作的话,那就直接编码成一个at消息啊,就是当前我发一条数据,这个数据呢,我们把它包装成一个消息,消息有一个当前的操作,这个操作叫A。就相当于这个就有点儿像我们的那个加爱一样。那同样另外我们还可以编码一个delete操作,如果我要对这个表里面删除一条数据怎么办呢?哎,那你也是编辑一一条数据,后边是数据,前面有当前的操作,这个操作叫rere。
06:15
诶,那对应的问题就来了,如果现在我不是简单的插入,也不是简单的删除,不是增删,而是改呢,Update呢,如果要更新一条数据的话,那不需要再去编码新的消息了,我只需要把它表示成两条数据的组合就可以了。也就是说,我们可以把它编码成被更改行,也就是更改之前信息的一个retra,然后再加上更改之后信息的一个A。一个新增,所以这就是我们所说的减U和加U啊,那本质上来讲,我们会发现所谓的加I插入一条消息,是不是也可以单纯的看成一个加U这样一个操作啊,那我就不管它到底是,呃,更新之后啊,就是删除了一条数据之后的插入还是没删除直接的插入,它都是插入嘛,所以本质上这两个在更新日志流里边可以合并啊,所以我们在撤回流里边其实只有两种编码消息,一种是A,一种是撤回,就可以把增删改三种经典的表操作,数据库操作全部都表达出来了。
07:29
所以对应我们之前的这样一个例子的话,我们可以看到。比方说。之前我们已经呃得到了这样一个。通过这样一个持续查询,得到了一个有更新操作的结果表啊,那那里边是会更改,不停的更改当前用户的一个访问的结果的统计统计数量,那所以现在它的改变会编码成什么样的信息进行输出,得到一个流呢?之前我们写出来的得到结果是那个动态表啊,现在我们把它编码成流。
08:05
得到的实际是这样的啊,我们看到用加来表示insert,也就是A消息,用钱来表示delete,也就是retra消息,那当前就是什么呢?Alice丝第一条数据来了之后,我们知道里边插入了一个ALICE1啊,那就是加ALICE1。然后Bob这个数据来了之后,诶没有修改,那是在后面追加,所以继续加Bob e。然后接下来Alice又来了一条数据,那是要更新之前的爱ice,一,把它更新成爱丽丝,二,怎么办呢?把它包装成两条消息。一条之前的g alice1,一条加ALICE2,所以我们看这跟我们所理解的之前to stream打印出来的那个效果其实是非常相似的。就是把一个一条更新操作用两条数据两条信息表示出来,这样的话,数据库那边其实我们就会发现,只要接到对应的这样一个信息,那我就直接把对应的这个对应的这个数据进行插入或者进行删除就完了嘛,我就不管到底是更新还是什么样的操作了,我就只管增和删就完事了。
09:20
那对应的最后如果又来了一条carry的访问数据的话,那还是在后面追加,所以是加CARRY1,这就是到最后转换成流之后的效果,这是一个撤回流的表达方式。我们会发现这样一个撤回流的编码方式很好理解,但是它有一个问题就是,呃,经常我们就会出现发生了一次更新操作之后来了一条数据,最后我们要用两条消息发出两条消息变成转化成两条数据,然后告诉外部数据库我们当前做了一个操作,那这个显然效率就没有那么高,那能不能只发一条消息就能说明当前做了什么事情呢?也有这样的编码方式,那接下来我们介绍的就是另外一种编码。
10:07
所谓的更新插入流,更新插入是指的是upsur UPS stream,所谓的更新插入其实是包含了更新和插入两个操作,这里的upsur是一个合成词,就是update和insert的合成,它里边呢就只包,也是只包含两种类型的消息,一种是叫做更新插入消息消息。不是艾了,它是更新插入。看起来也就包含了,跟之前的ID有点像啊,也就包含了之前的插入操作,而且更新也是用它来表示。另外还有一条是删除delete,这个跟之前是一样的,那所以接下来对于这样一个更新插入流而言,怎么样去表示数据库里边的增删改三种操作呢?呃,其实很简单,那就是不管是插入还是更新ins和up,它统一都是up消息。
11:05
就是你插入一条消息,我也是前面的前缀,Upset告诉这是一个。更新插入操作,然后后面追上跟上我们当前的这个数据啊,那你如果要是更新一条数据的话,也是UPS,然后跟上跟上对应的数据就可以了。而如果要是删除数据的话,Delete的话当然就单独的编码成一个delete消息就可以了。那我们会发现它跟之前的撤回流相比的话,只是相当于只是把这个插入和更新操作合并了,不再做区分了,那我们就想到一个问题,那如果说现在我们想要去更新一行数据的时候,你怎么能够发这样一条消息告诉外部数据库,然后数据库就知道我当前是做了一个更新,而不是要去在后边追加呢?也就是说我这儿UPS一个A2的时候。我怎么知道数据库是要要去找原先A的值,把它改更新成二,而不是直接把这个A2追加到后边呢?
12:06
哎,这就是要求当前动态表里边必须要指定一个唯一的K,而且这个K就是外部数据库也应该是支持当前K当前主件的设置的,通过这样一个K,那就可以进行对应的查询,查到了之后就可以把它做一个唯一的更新,所以这个我们就非常理解了,这就相当于我们是一个类似于哈希map的一个数据存储嘛。哈希,Map里边我们的put操作。PUT1对k value的时候,我们就会发现当前的K只要确定了,那其实我不需要考虑这个哈希map里边到底有没有对应的这个K数据,对吧?哎,那所以如果有的话,我就是更新,把对应的值更新成V,如果没有的话,那就相当于是直接插入嘛,这就是哈希ma克这个操作啊,就是一个典型的up的操作,我们的插入和更新就可以合并在一起。
13:08
那接下来我们可以看一下上面这个例子,同样的一个持续查询。经过转换之后得到的结果动态表应该进行怎么样的一个编码,得到对应的流信息数据流,哎,那所以现在的话我们就简单很多了,那就是爱ice的一条数据来了之后,那首先当前就是插入一个爱ICE1嘛,所以我们当前这个所谓的UPS就是全部用这个星号来表示了。减号是表示delete,那所以我们就会发现了,接下来只要你没有出现delete,不管是插入一个新的,还是把它更新成二,那都是来了之后就芯爱ICE1,芯BOB1,芯爱ICE2,那告诉外部系统的话,外部系统知道这个爱丽丝当前的user是唯一的T,那我就找爱丽丝之前是多少,之前是一好就把它更新成二就可以。
14:00
所以这样的话就可以更加简洁的进行。结果数据流的编码啊,当前的效率会更高一些,那当然它的缺陷就在于我们必须要针对当前的这个流,或者说动态表有一个所谓的唯一的K的定义,而且这个K在外部,在我们数据库里边也是支持的,也是相同的K的定义,这样的话才能使用。更新插入流来进行编码啊,那所以具体在使用的过程当中,在项目当中能不能使用更新编码这样一个更新插入流的编码这样一个高效的方式,主要是要看外部系统是否是否支持,也就是看我们think到外部的时候啊,这样一个连接器是否给我们提供了这种写入方式。这就是关于把。动态表得到的结果最终在编码转换成数据流写入外部系统的过程。
我来说两句