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");
}
}