00:00
那我们给大家主要介绍的就是这个模式怎么样去定义,有个体模式,然后组合起来变成了一个模式序列,定义好了这个模式Python之后呢,那接下来怎么做呢?诶,那下一步操作其实是要把它应用到当前的输入流上面去,对吧?去检测呃,可能存在的这种复杂事件,所以这个应用的过程呢,就是先得到我们的那个数据流data stream,然后呢,定义出一个pattern,接下来调cep.pattern方法,把数据流和patternth作为参数传入,就得到了一个patternon stream啊大家可以知道,就是这有点像我们之前那个呃,就是split select一样,做split的时候,大家想是不是就相当于已经按照那个标签,就相当于盖了一个戳啊,已经做了一个分组,对吧,那我们这里大家也可以认为我相当于是已经盖了一个戳,已经把它已经把它检测到了,对吧,一组一组的这个复杂事件,这个只要一应用我就把它检测到了,但是呢。
01:00
还没有拣选出来,后边是不是就还要再来一个select,把对应的那个复杂事件提取出来啊,啊,所以这就是我们前面看到的这个这个图里边。大家看到的这个过程对吧,就我们这里边一开始做的这个patternon应用啊,把它应用上去之后,可能能够拿到的就是只是把它拣选到了这个流里边找到了,然后接下来我是不是要select把这个提取出来,再做一个转换啊,啊所以接下来的这个API的调用那就是。基于pattern select,基于pattern stream,然后做一个select操作,对吧?调一个select或者select select方法,这样的话就可以从检测到的事件序列里边把对应的那个事件都提取出来,然后做一个转换操作,那这里边要给大家说的是select方法,需要传的是一个select Python select function,那么这个function里边主要就是要实现一个select方法对吧?那大家想一下这个select方法是什么时候调用呢?这其实就是我们之前说的,每检测到一个匹配的复杂事件组合,是不是就会掉一次这里的select方法呀,所以大家发现它的输入参数其实是一组事件对吧?就是我们定义的那匹配到的那一组复杂复杂事件,那么这一组复杂事件我怎么样去保存起来呢?怎么样表现出来呢?所以大家看到这个参数是一个map。
02:30
是一个key value,对,所以这里边的map数据结构呢,Key是一个string value是一个list,就是当前输入数据类型的一个list,一个列表,那现在大家理解能够理解这个数据类型为什么这么设计吗?首先这个K对应的就是前面我们拍的里面定义的那个名称对吧?所以就是一个名称,比方说前面我们定义了一个start,那大家想是不是就对应的有一个start这个key后边存着的那个value是不是就是start对应拣选出来的那个事件啊,单独的个体模式提炼出来的那个事件对吧?哎,所以这里边就是有一个事件作为值放进去了,那后边如果你有这个and对吧?有middle,有and,那对应的是不是也是一个一个key,后边我们可以对应它个体模式提提取出来的那个事件,好,这就是保存成一个map的原理,那为什么这里是一个list呢?
03:24
哎,前面我们不是讲有循环模式嘛,对吧?诶,一个个体模式里边你可以是个体模,就是可以是一个单立模式,只有一个事件,那里边就只有一个数,那如果要是循环模式的话,大家想是不是我一个个体模式,一个start里边可能就检测到好几个事件啊,那这好几个事件我现在都叫一个名称,都叫start,那是不是就得保存成一个list了?哎,所以这个list主要是用来处理这个循环事件的。循环模式的啊,那所以大家看接下来我就可以从map里边提取出比方说每一步操作,每一个个体模式里边对应的那个事件,然后接下来是不是就可以把对应的这个事件包装成做转换计算,包装成我们想要的这个输出数据结构就可以了。
04:14
所以我们说这个s select有点像一个特殊的map,只不过它的输入数据类型是一个检测到的所有复杂事件的一个map ky6这样的一个数据结构,对吧?啊,那呃,我们还看到API里边有一个flat select里边要实现的那个参数就是一个。Pattern select select function式对吧?那里边呢,也是要去实现的一个方法是select select,它也是每一次我们检测到一个复杂事件就会掉一个这个方法格,和这里边s select的区别主要就在于它的保存还是一个map对吧?主要的区别就在于没有直接的这个返回值类型了,它可以是返回值是VO啊,那那怎么样返回呢?用out.collect对吧?呃,这个返回就更加的灵活一点,你可以输出一个,也可以输出多个,甚至可以不输出都是可以的,这就是关于这个匹配事件的提取和转换,所以大家看这个跟我们之前讲的那个呃,Connect之后做的那个Co map Co Fla map操作也差不多对吧?啊,跟那个split里之后做的那个select操作也有点像,大家都可以结合起来看啊。
05:26
那另外呢,还有一个比较特殊的,对于这个检测到事件的一个提取方式,就是前面大家讲到我们讲到了那个within,对吧,Within是指定了一个时间范围去做这个事件匹配的,那大家想到如果要是有within,有within的话,其实是有一个比较特殊的场景的,就是我们前面讲到的这个匹配处理啊,那就是按照我们模式的定义,Pthon定义,如果要是每一步操作都完全发生的话,那我们检测到匹配,这就是一个匹配,呃,成功的结果,对吧?就去调那个s select方式去做处理就可以了,那如果要是不匹配的话,不匹配就丢弃,对吧,那就接下来它就不做提取和处理就完事了。那接下来如果说我们用了一个within的话,就会有另外一种中间状态,就是其实它每一步操作都是匹配的,但是呢,对它是到时间了结果。
06:21
超时了对吧,超时了,最后这个相当于我们强行给他截止,最后没有得到一个正常匹配的结果,那大想在有些场景下,我是不是就专门要处理这个超时的事件啊。对吧,因为他其实不是严格意义上来讲,不叫匹配不成功,它是匹配成功了一部分,但是后边还没匹配完,我们就不等了嘛,就直接让他超时了,所以在这种场景下,怎么检测到这个超时的部分匹配的这一组事件呢?那这里边我就要定义一个,哎,就是允许处理超时事件的一个函数,这个叫做一个。Pattern。
07:01
呃,大家看叫做pattern timeout方式对吧?就如果说我这里边用的是一个flat select的话,那这里面传的参数就叫做一个pattern flat timeout方式。所以大家看到这个原理是什么呢?调用的时候还是pattern STEM去调select或者Fla select里边传的参数就多了,就不是只传一个拍select方式了,对吧?这里边要传三个参数。除了我们讲的这个pattern select function之外,或者是Fla select function,对吧?啊,那还要传一个Python timeout function,另外还要传一个特殊出流标签,哎,这就是我们说的,你这里边不是做这个提取吗?提取出来的结果是不是还是应该是用那个select方式去做处理啊,处理到主流去做输出,对吧?那你如果要是超时事件怎么办呢?超时视线给一个测输出流标签,然后用拍out的方式去做一个处理,最后是输出到了侧输出流里面去。
08:03
所以后边哎,我接下来是不是就用这个测输出流的这个获取方式啊,Get side output,呃,然后去把当前的这个标签传入对吧,获取到当前的,这就是tout的事件,超时的事件啊,这就是我们对于这个cep啊,超时事件的一个处理,整个的处理流程就是这样的。
我来说两句