pig2 发表于 2019-6-17 10:46:25

Flink难点:彻底明白CEP6,匹配跳过策略【api】

问题导读

1.匹配跳过策略的作用是什么?
2.匹配跳过策略有哪四种?
3.匹配跳过策略代码如何实现?

上一篇
Flink难点:彻底明白CEP5,组模式以及组操作【api】
http://www.aboutyun.com/forum.php?mod=viewthread&tid=27311


1.匹配跳过策略介绍
所以为匹配跳过策略,是对多个成功匹配的模式进行筛选。也就是说如果多个匹配成功,可能我不需要这么多,按照匹配策略,过滤下就可以。

对于给定模式,可以将同一事件分配给多个匹配【成功】。 要控制分配事件的匹配数,需要指定名为AfterMatchSkipStrategy的跳过策略。

跳过策略有四种类型,如下所示:

[*]NO_SKIP: 每个可能的匹配都被触发。
[*]SKIP_PAST_LAST_EVENT: 丢弃匹配开始后但结束前每个部分匹配。
[*]SKIP_TO_FIRST: 丢弃在匹配开始后但在PatternName的第一个事件发生之前开始的每个部分匹配。
[*]SKIP_TO_LAST: 丢弃在匹配开始后但在PatternNam发生的最后一个事件之前开始的每个部分匹配。

注意,使用SKIP_TO_FIRST和SKIP_TO_LAST跳过策略时,还应指定有效的PatternName。

【注意,这里的匹配跳过策略,其实针对的是循环重复出现的事件,比如SKIP_TO_FIRST,SKIP_TO_NEXT等】

例如,对于给定模式b + c和数据流b1 b2 b3 c,这四种跳过策略之间的差异如下:

1.跳过策略:
NO_SKIP

结果:
b1 b2 b3 c
b2 b3 c
b3 c


描述:
找到匹配b1 b2 b3 c后,匹配过程不会丢弃任何结果。

2.跳过策略:
SKIP_TO_NEXT

结果:
b1 b2 b3 c
b2 b3 c
b3 c

描述:
找到匹配b1 b2 b3 c后,匹配过程不会丢弃任何结果,因为没有其他匹配可以从b1开始。

3.跳过策略:
SKIP_PAST_LAST_EVENT

结果:
b1 b2 b3 c

描述:
找到匹配b1 b2 b3 c后,匹配过程将丢弃所有已开始的部分匹配。

4.跳过策略:
SKIP_TO_FIRST

结果:
b1 b2 b3 c
b2 b3 c
b3 c


描述:
找到匹配b1 b2 b3 c后,匹配过程将尝试丢弃在b1之前开始的所有部分匹配,但是没有这样的匹配。 因此,不会丢弃任何东西。



5.跳过策略:
SKIP_TO_LAST

结果:
b1 b2 b3 c
b3 c

描述:
找到匹配b1 b2 b3 c后,匹配过程将尝试丢弃在b3之前开始的所有部分匹配。 有一个这样的匹配b2 b3 c

另外看另一个例子,以便更好地看到NO_SKIP和SKIP_TO_FIRST之间的区别:模式:(a | b | c)(b | c)c + .greedy d和序列:a b c1 c2 c3 d然后结果将是:
1.跳过策略:
NO_SKIP

结果:
a b c1 c2 c3 d
b c1 c2 c3 d
c1 c2 c3 d

描述:
找到匹配b c1 c2 c3 d后,匹配过程不会丢弃任何结果。

2.跳过策略:
SKIP_TO_FIRST

结果:
a b c1 c2 c3 d
c1 c2 c3 d

描述:
找到匹配b c1 c2 c3 d后,匹配过程将丢弃在c1之前开始的所有部分匹配。 有一个这样的匹配b c1 c2 c3 d。

为了更好地理解NO_SKIP和SKIP_TO_NEXT之间的区别,请看下面的例子:模式:a b +和序列:a b1 b2 b3然后结果将是:
1.跳过策略:
NO_SKIP

结果:
a b1
a b1 b2
a b1 b2 b3

描述:
找到匹配b1后,匹配过程不会丢弃任何结果。

2.跳过策略:
SKIP_TO_NEXT

结果:
a b1

描述:
找到匹配b1后,匹配过程将丢弃从a开始的所有部分匹配。 这意味着既不能生成b1 b2也不生成b1 b2 b3。
【这里我们看到SKIP_TO_NEXT,其实是对于重复的忽略而已】

要指定要使用的跳过策略,只需通过调用以下命令创建AfterMatchSkipStrategy:

2.匹配跳过策略编程

1.函数
AfterMatchSkipStrategy.noSkip()      

描述
创建NO_SKIP跳过策略

2.函数
AfterMatchSkipStrategy.skipToNext()      

描述
创建SKIP_TO_NEXT跳过策略


3.函数
AfterMatchSkipStrategy.skipPastLastEvent()      

描述
创建SKIP_PAST_LAST_EVENT跳过策略

4.函数
AfterMatchSkipStrategy.skipToFirst(patternName)      

描述
使用引用的模式名称patternName创建SKIP_TO_FIRST跳过策略

5.函数
AfterMatchSkipStrategy.skipToLast(patternName)      

描述
使用引用的模式名称patternName创建SKIP_TO_LAST跳过策略
通过调用将跳过策略应用于模式:
AfterMatchSkipStrategy skipStrategy = ...
Pattern.begin("patternName", skipStrategy);
val skipStrategy = ...
Pattern.begin("patternName", skipStrategy)
注意对于SKIP_TO_FIRST / LAST,当没有元素映射到指定变量时,如何处理大小写有两种选择。 默认情况下,在这种情况下将使用NO_SKIP策略。 另一种选择是在这种情况下抛出异常。 可以通过以下方式启用此选项:
AfterMatchSkipStrategy.skipToFirst(patternName).throwExceptionOnMiss()

AfterMatchSkipStrategy.skipToFirst(patternName).throwExceptionOnMiss()


最新经典文章,欢迎关注公众号http://www.aboutyun.com/data/attachment/forum/201903/18/215536lzpn7n3u7m7u90vm.jpg


About云 VIP会员套餐介绍http://www.aboutyun.com/forum.php?mod=viewthread&tid=27305
加入About云知识星球,获取更多实用资料
http://www.aboutyun.com/data/attachment/forum/201906/10/162109faj7o1z2qobr83jd.png

zuliangzhu 发表于 2019-10-10 13:38:03

写的非常棒,学习了

金瞳 发表于 2019-12-9 16:32:46

1.匹配跳过策略的作用是什么?
- 匹配跳过策略,是对多个成功匹配的模式进行筛选

2.匹配跳过策略有哪四种?
- NO_SKIP: 每个可能的匹配都被触发。
- SKIP_PAST_LAST_EVENT: 丢弃匹配开始后但结束前每个部分匹配。
- SKIP_TO_FIRST: 丢弃在匹配开始后但在PatternName的第一个事件发生之前开始的每个部分匹配。
- SKIP_TO_LAST: 丢弃在匹配开始后但在PatternNam发生的最后一个事件之前开始的每个部分匹配。

3.匹配跳过策略代码如何实现?
- AfterMatchSkipStrategy.noSkip()   创建NO_SKIP跳过策略
- AfterMatchSkipStrategy.skipToNext()   创建SKIP_TO_NEXT跳过策略
- AfterMatchSkipStrategy.skipPastLastEvent()   创建SKIP_PAST_LAST_EVENT跳过策略
- AfterMatchSkipStrategy.skipToFirst(patternName)使用引用的模式名称patternName创建SKIP_TO_FIRST跳过策略
- AfterMatchSkipStrategy.skipToLast(patternName)      使用引用的模式名称patternName创建SKIP_TO_LAST跳过策略
页: [1]
查看完整版本: Flink难点:彻底明白CEP6,匹配跳过策略【api】