第1关:单模式
编程要求
根据提示,在右侧编辑器补充代码,匹配数据集中两个连续的 "alert" 事件,代码中已经为你提供数据集。
测试说明
平台会对你编写的代码进行测试:
测试输入:无;
预期输出:
Pattern found: {start=[alert], end=[alert]}
答案代码
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
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.time.Duration;
import java.util.List;
import java.util.Map;
public class sign_mode {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
// 输入数据源
DataStream<String> input = env.fromElements(
"event1",
"alert",
"event2",
"alert",
"event3",
"alert",
"alert"
).assignTimestampsAndWatermarks(
WatermarkStrategy
.<String>forBoundedOutOfOrderness(Duration.ofSeconds(5))
.withTimestampAssigner((event, timestamp) -> System.currentTimeMillis())
);
// ********** Begin **********
// 定义模式,这里我们寻找的是两个连续的 "alert" 事件
Pattern<String, ?> pattern = Pattern.<String>begin("start")
.where(new SimpleCondition<String>() {
@Override
public boolean filter(String value) {
return "alert".equals(value);
}
})
.next("end")
.where(new SimpleCondition<String>() {
@Override
public boolean filter(String value) {
return "alert".equals(value);
}
});
// 使用 CEP 库进行模式匹配,并打印出来
DataStream<String> result = CEP.pattern(input, pattern)
.select(new PatternSelectFunction<String, String>() {
@Override
public String select(Map<String, List<String>> pattern) {
String start = pattern.get("start").get(0); // 第一个 "alert" 事件
String end = pattern.get("end").get(0); // 第二个 "alert" 事件
return "Pattern found: {start=[" + start + "], end=[" + end + "]}";
}
});
result.print();
// ********** End **********
result.writeAsText("/root/files/result.csv");
env.execute();
}
}
第2关:模式序列
编程要求
根据提示,在右侧编辑器补充代码,进行组合模式匹配 A 后面跟着一个或多个(不确定连续的)B,然后跟着一个 C,题目已提供数据集。
测试说明
平台会对你编写的代码进行测试:
测试输入:无;
预期输出:
[B]
[B, B, B]
[B, B]
[B, B]
[B, B]
[B]
答案代码
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
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.time.Duration;
import java.util.List;
import java.util.Map;
public class more_mode {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
// 输入数据源,可以根据实际情况进行替换
DataStream<String> input = env.fromElements(
"A", "B", "C", "A", "B", "B", "C", "A", "C"
).assignTimestampsAndWatermarks(
WatermarkStrategy.<String>forBoundedOutOfOrderness(Duration.ofSeconds(5))