Flink CEP(八)之followedBy方法

followedBy是Flink CEP(复杂事件处理)库中的一个关键方法,用于在复杂事件流中查找一个事件跟随另一个事件的模式。注意和next不同的是不必是严格紧贴的

假设我们有一个由用户点击和订单提交组成的事件流,我们想要找到所有的点击事件后紧接着订单提交事件的序列

package flink.cep;

import org.apache.flink.cep.CEP;
import org.apache.flink.cep.PatternSelectFunction;
import org.apache.flink.cep.pattern.Pattern;
import org.apache.flink.cep.pattern.conditions.SimpleCondition;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

import java.util.List;
import java.util.Map;

/**followedBy 检测出是方块数据后下一个事件不是必须匹配到是圆圈
 * 原始数据
 * "方块1","圆圈2","方块3","方块4","菱形5","圆圈6","菱形7","方块8","方块9","方块10","方块11"
 *
 * 结果
 匹配次数:1匹配结果:[方块1][圆圈2]
 匹配次数:2匹配结果:[方块3][圆圈6]
 匹配次数:3匹配结果:[方块4][圆圈6]
 *
 */
public class FllowedByTest {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);
        DataStream<String> input = env.fromElements("方块1","圆圈2","方块3","方块4","菱形5","圆圈6","菱形7","方块8","方块9","方块10");
        Pattern<String,String> pt = Pattern.<String>begin("step-1").where(new SimpleCondition<String>() {
            @Override
            public boolean filter(String s) throws Exception {
                return s.contains("方块");
            }
        }).followedBy("step-2").where(new SimpleCondition<String>() {
            @Override
            public boolean filter(String s) throws Exception {
                return s.contains("圆圈");
            }
        });
        //input,pt 输入数据,模式
        // PatternSelectFunction<String, String> 输入数据流的格式,返回数据的格式
        DataStream<String> result =    CEP.pattern(input,pt).inProcessingTime().select(new PatternSelectFunction<String, String>() {
            /**
             * Map<String, List<String>> map key 为Pattern.<String>begin("step-1")定义的step-1
             */
            int count = 0;
            public String select(Map<String, List<String>> map) throws Exception {
                List<String> step1 =   map.get("step-1");
                List<String> step2 =   map.get("step-2");
                count+=1;
                String info = "匹配次数:"+count+"匹配结果:"+step1+step2;
                return info;
            }
        });


        result.print().setParallelism(1);
        //注意:因为flink是懒加载的,所以必须调用execute方法,上面的代码才会执行
        env.execute("streaming flink cep");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫1981

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值