大数据全系列 教程
1869个小节阅读:467.8k
目录
408考研
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
有了定义好的个体模式,就可以尝试按一定的顺序把它们连接起来,定义一个完整的复杂
事件匹配规则了。这种将多个个体模式组合起来的完整模式,就叫作“组合模式”(Combining Pattern),为了跟个体模式区分有时也叫作“模式序列”(Pattern Sequence)。
一个组合模式有以下形式:
xxxxxxxxxx
val pattern = Pattern.begin[Event]("start").where(...)
.next("next").where(...)
.followedBy("follow").where(...)
...
组合模式其实就是一个“模式序列”,是用诸如 begin()、next()、followedBy()等,表示先后顺序的“连接词”将个体模式串连起来得到的。在这样的语法调用中,每个事件匹配的条件是什么、各个事件之间谁先谁后、近邻关系如何都定义得一目了然。每一个“连接词”方法调用之后,得到的都仍然是一个 Pattern 的对象;所以从 Java 对象的角度看,组合模式与个体模式是一样的,都是 Pattern。
模式之间的组合是通过一些“连接词”方法实现的,这些连接词指明了先后事件之间有着怎样的近邻关系,这就是所谓的“近邻条件”(Contiguity Conditions,也叫“连续性条件”)。
Flink CEP 中提供了三种近邻关系:
首先定义初始模式:
xxxxxxxxxx
val start = Pattern.begin[Event]("start").where(...)
匹配的事件严格地按顺序一个接一个出现,中间不会有任何其他事件。代码中对应的就是 Pattern.next()
方法,名称上就能看出来,“下一个”自然就是紧挨着的。
xxxxxxxxxx
val strict = start.next("next").where(...)
宽松近邻(Relaxed Contiguity)
宽松近邻只关心事件发生的顺序,而放宽了对匹配事件的“距离”要求,也就是说两个匹配的事件之间可以有其他不匹配的事件出现。代码中对应 followedBy()方法,很明显这表示“跟在后面”就可以,不需要紧紧相邻。
xxxxxxxxxx
val relaxed = start.followedBy("middle").where(...)
这种近邻关系更加宽松。所谓“非确定性”是指可以重复使用之前已经匹配过的事件;这种近邻条件下匹配到的不同复杂事件,可以以同一个事件作为开始,所以匹配结果一般会比宽松近邻更多。代码中对应 followedByAny()方法。
xxxxxxxxxx
val nonDetermin = start.followedByAny("middle").where(...)
除以上模式序列外,还可以定义“不希望出现某种近邻关系”:
.notNext() —— 不想让某个事件严格紧邻前一个事件发生
.notFollowedBy() —— 不想让某个事件在两个事件之间发生,后面还需要有模式才可使用,即:一个模式不能以notFollowedBy()模式结束。
注意:
所有模式序列必须以 .begin() 开始
模式序列不能以 .notFollowedBy() 结束
“not” 类型的模式不能被 optional 所修饰
还可以为模式指定时间约束,用来要求在多长时间内匹配有效
xxxxxxxxxx
middle.within(Time.seconds(10))
实时效果反馈
1. 以下选项中关于Flink近邻关系的是?
A Pattern.next()
严格近邻,匹配的事件严格地按顺序一个接一个出现,中间不会有任何其它事件。
B Pattern.followedBy()
宽松近邻只关心事件发生的顺序,而放宽了对匹配事件的“距离”要求,也就是说两个匹配的事件之间可以有其他不匹配的事件出现。
C Pattern.followedByAny()
非确定性宽松近邻这种近邻关系比宽松近邻更加宽松,所谓“非确定性”是指可以重复使用之前已经匹配过的事件
D 以上三个选项都正确。
答案:
1=>D