声明: 1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识 内容详细全面, 言辞官方的文章
2. 由于是个人总结, 所以用最精简的话语来写文章
3. 若有错误不当之处, 请指出
用一个模式去匹配数据流里的事件, 类似于正则表达式
模式是处理事件的规则
Pattern API:API示例 & select & flatSelect:
Pattern个体模式:patternStart = Pattern. begin("start"); Pattern wherePattern = patternStart.where((event)->return event.getName.startWith("foo")) PatternStream patternStream = CEP.pattern(dataDs, wherePattern) // 根据个体模式的名称 选择得到想要的事件并进行处理 patternStream.select(new PatternSelectFunction { @Override public ComplexEvent select(Map map) throws Exception { // Map > 即"patternName" -> List集合, 对于个体模式的单例模式, 其实List里只有一个元素 return xxx; } }) // 增强: 可以将超出within时间范围(不管是否能匹配得上)的 超时数据 放到侧输出流 patternStream.select(null, // 处理超时数据, 返回值数据会被丢进侧输出流 new PatternTimeoutFunction ( ) { @Override public ComplexEvent timeout(Map > map, long ts) throws Exception { return null; } }, // 处理正常数据 new PatternSelectFunction ( ) { @Override public ComplexEvent select(Map > pattern) throws Exception { return null; } } ) // 对于flatSelect, 功能增强: 以out.collect的方式输出任意多个元素
对一种事件直接就可以进行匹配
分为单例模式和循环模式: 单例模式只能接收一个事件, 循环模式可以接收多个事件
量词: 指定循环次数
.times(4)
匹配出现4次
.times(4).optional
匹配出现0次或4次
.times(2,4)
匹配出现2-4次
.times(2,4).greedy
匹配出现2-4次, 并且贪心地尽可能多的进行匹配
.oneorMore
匹配出现至少一次, 要带上终止条件until( )
.timesOrMore(2).optional.greedy
匹配出现0次, 2次, 或多次, 并且贪心地尽可能多的进行匹配, 要带上终止条件until( )
简单条件: 通过.where( )进行筛选
patternStart.where((event)->return event.getName.startWith("foo"))
组合条件: 对简单条件进行or或者where组合, 其中继续.where实质上就是and操作
patternStart.where((event)->return event.getName.startWith("foo")).or((event)->return event.getName.startWith("stupid"))
终止条件: 对于xxxMore的循环次数指定, 要带上终止条件until( )
迭代条件: 能对之前接收的事件进行处理
ctx.getEventsForPattern("name").where(( )->{ 逻辑处理 })
模式序列(组合模式):
将很多个体模式组合起来
必须以"start"模式开头 .begin(“start”)
**严格近邻: ** 所有事件按严格的顺序出现, 中间不能穿插其他数据; 例如 a next b, 则b必须得紧跟在a后面才能匹配得上
.next(“otherPattern”), 参数为别的个体模式
宽松紧邻: 允许中间穿插其他数据; 例如 a followedBy b, b只要在a的后面就可以, 不必非得紧跟其后
.followedBy(“otherPattern”)
非确定性宽松近邻: 进一步放宽条件, 之前已经匹配过的事件可以被再次使用;
例如 a followedByAny b, 事件序列[a,c,b1,b2] 可以匹配成{a,b1},{a,b2}
.followedByAny(“otherPattern”)
其他关系:
.notNext(“otherPattern”)
.notFollowedBy(“otherPattern”)
注意:
.notFollowedBy不能用在结尾, 不然将永无终止
可以为模式指定时间约束, 在规定时间内才能有机会进行匹配;
.within(Time.seconds(10))
within并不管keyBy的分组, 它只认时间 不认其是否为同一个key的时间; 模式序列里的next等条件倒是认key模式序列里的next等条件是到了within时间结束后才进行计算可以看作是窗口大小为within时间段长度的窗口, 不同的是它会自动按时间戳排序后再进行计算
notXXX类型的模式不能被optional(可能出现)修饰
模式组:一般不用, 是个套娃, 将一个模式序列作为一个条件 放在个体模式里



