看起来像是CEP示例的flink-training-exercise中的错误

时间:2018-05-31 15:21:36

标签: apache-flink flink-streaming flink-cep

我在以下网址中找到了CEP的示例 https://github.com/dataArtisans/flink-training-exercises/blob/master/src/main/java/com/dataartisans/flinktraining/exercises/datastream_java/cep/LongRides.java

此练习的目标是为乘坐前两个小时内未与END事件匹配的出租车游乐设施发出START事件。" 但是,根据下面的代码,似乎有一种模式可以找到在2小时内完成的游乐设施,而不是在2小时内完成 NOT

看起来模式首先找到Start事件,然后找到End Event(!ride.isStart),并且在2小时内,所以它没有解释为找到游乐设施的模式已经完成2小时?

Pattern<TaxiRide, TaxiRide> completedRides =
            Pattern.<TaxiRide>begin("start")
                    .where(new SimpleCondition<TaxiRide>() {
                        @Override
                        public boolean filter(TaxiRide ride) throws Exception {
                            return ride.isStart;
                        }
                    })
                    .next("end")
                    .where(new SimpleCondition<TaxiRide>() {
                        @Override
                        public boolean filter(TaxiRide ride) throws Exception {
                            return !ride.isStart;
                        }
                    });

    // We want to find rides that have NOT been completed within 120 minutes
    PatternStream<TaxiRide> patternStream = CEP.pattern(keyedRides, completedRides.within(Time.minutes(120)));

1 个答案:

答案 0 :(得分:1)

我已经改进了示例解决方案中的注释,以使其更清晰。

// We want to find rides that have NOT been completed within 120 minutes.
// This pattern matches rides that ARE completed.
// Below we will ignore rides that match this pattern, and emit those that timeout.
PatternStream<TaxiRide> patternStream = CEP.pattern(keyedRides, completedRides.within(Time.minutes(120)));

OutputTag<TaxiRide> timedout = new OutputTag<TaxiRide>("timedout"){};

SingleOutputStreamOperator<TaxiRide> longRides = patternStream.flatSelect(
        timedout,
        new TaxiRideTimedOut<TaxiRide>(),
        new FlatSelectNothing<TaxiRide>()
);