首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flink CEP贪婪匹配

Flink CEP贪婪匹配
EN

Stack Overflow用户
提问于 2017-12-30 04:25:25
回答 2查看 474关注 0票数 0

我正在和Flink CEP贪婪的运算符进行一场战斗。

给定以下java代码:

代码语言:javascript
复制
    final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

    List<String> strings = Arrays.asList("1,3,5,5,5,5,6,".split(","));

    DataStream<String> input = env.fromCollection(strings);

    Pattern<String, ?> pattern = Pattern.<String>
    begin("start").where(new SimpleCondition<String>() {
        @Override
        public boolean filter(String value) throws Exception {
            return value.equals("5");
        }
    }).oneOrMore().greedy()
    .followedBy("end").where(new SimpleCondition<String>() {

        @Override
        public boolean filter(String value) throws Exception {
            return value.equals("6");
        }
    });

    PatternStream<String> patternStream = CEP.pattern(input, pattern);

    DataStream<String> result = patternStream.select(new PatternSelectFunction<String, String>() {
        @Override
        public String select(Map<String, List<String>> pattern) throws Exception {
            System.err.println("=======");
            pattern.values().forEach(match -> match.forEach(event -> System.err.println(event)));
            System.err.println("=======");
            return "-";
        }
    });

    result.print();
    env.execute("Flink Streaming Java API Skeleton");

我希望看到:只发出"5 5 5 6“

但是,它与"5 5 5 6“、"5 5 5 6”、"5 5 6“、"5 6”

如果我这样做了:

代码语言:javascript
复制
    begin("start").where(new SimpleCondition<String>() {
        @Override
        public boolean filter(String value) throws Exception {
            return value.equals("3");
        }
    }).followedBy("middle").where(new SimpleCondition<String>() {
        @Override
        public boolean filter(String value) throws Exception {
            return value.equals("5");
        }
    }).oneOrMore().greedy()
    .followedBy("end").where(new SimpleCondition<String>() {

        @Override
        public boolean filter(String value) throws Exception {
            return value.equals("6");
        }
    });

然而,(因此提供了不同的起始匹配)贪婪操作符通过发出"3 5 5 5 6“来按预期工作。

有没有可能让一个贪婪的匹配者在没有不同的开始模式的情况下抓取所有的匹配?

还是我错过了什么?

斯蒂芬

EN

回答 2

Stack Overflow用户

发布于 2018-05-04 02:03:45

感谢Chesnay Schepler的上述评论:

有一个关于贪婪匹配的已知bug可以解释这种行为: issues.apache.org/jira/browse/FLINK-8914

我暂时会注意到这一点作为答案。

票数 1
EN

Stack Overflow用户

发布于 2019-04-02 11:47:58

要控制将分配给事件的匹配数,您需要指定名为AfterMatchSkipStrategy的跳过策略。

使用Pattern.begin("start",AfterMatchSkipStrategy.skipPastLastEvent())

代码语言:javascript
复制
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

List<String> strings = Arrays.asList("1,3,5,5,5,5,6,".split(","));

DataStream<String> input = env.fromCollection(strings);

Pattern<String, ?> pattern = Pattern.<String>
        begin("start", AfterMatchSkipStrategy.skipPastLastEvent()).where(new SimpleCondition<String>() {
  @Override
  public boolean filter(String value) throws Exception {
    return value.equals("5");
  }
}).oneOrMore().greedy()
        .followedBy("end").where(new SimpleCondition<String>() {
          @Override
          public boolean filter(String value) throws Exception {
            return value.equals("6");
          }
        });

PatternStream<String> patternStream = CEP.pattern(input, pattern);

DataStream<String> result = patternStream.select(new PatternSelectFunction<String, String>() {
  @Override
  public String select(Map<String, List<String>> pattern) throws Exception {
    System.err.println("=======");
    pattern.values().forEach(match -> match.forEach(event -> System.err.println(event)));
    System.err.println("=======");
    return "-";
  }
});

result.print();
env.execute("Flink Streaming Java API Skeleton");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48028061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档