我是Apache Flink Api的新手,我正在尝试了解它提供的不同窗口。
我有一系列事件,例如:
device_id,trigger_id,event_time,messageId
1,START,1520433909396,1
1,TRACKING,1520433914398,2
1,TRACKING,1520433919398,3
1,STOP,1520433924398,4
1,START,1520433929398,5
1,TRACKING,1520433934399,6
1,TRACKING,1520433939399,7
1,TRACKING,1520433944399,8
1,STOP,1520433949399,9
其中trigger_id可以是指标,例如:开始,跟踪,停止
我想做的是基于device_id对所有传入事件进行分组,并根据trigger_id定义一个窗口。 I.e将所有事件从开始到停止分组,然后进行一些计算,例如:average,max etc.
这可以定义为GlobalWindow和基于trigger_id的自定义触发器,并使用自定义策略器每次都清除事件列表 触发止损。
另一种选择可能是使用Flink CEP。我定义了以下模式
DataStream<String> input = env.readTextFile("events.csv");
// create event stream
DataStream<Event> events = input.map(new LineToEvent());
DataStream<Event> waterMarkedStreams = events.assignTimestampsAndWatermarks(new EventAssigner());
Pattern<Event, Event> tripPattern =
Pattern.<Event>begin("start", AfterMatchSkipStrategy.noSkip())
.where(START_CONDITION)
.followedBy("middle").where(MIDDLE_CONDITION).oneOrMore()
.followedBy("end").where(END_CONDITION);
PatternStream<Event> patternStream = CEP.pattern(waterMarkedStreams, tripPattern);
DataStream<String> result = patternStream.select(
new PatternSelectFunction<Event, String>() {
@Override
public String select(Map<String, List<Event>> pattern) throws Exception {
StringBuilder builder = new StringBuilder();
builder.append(pattern.get("start").get(0).getMessageId()).append(",");
List<Event> vals = pattern.get("middle");
for (Event e: vals) {
builder .append(e.getMessageId()).append(",");
}
builder.append(pattern.get("end").get(0).getMessageId()).append(",");
return builder.toString();
}
});
result.print();
其中所有条件都是实现SimpleCondition的静态内部类
然而,该模式在事件流上匹配alll可能的解决方案,因为......
1> 1,2,3,4,
1> 1,2,3,6,9,
2> 1,2,4,
2> 5,6,7,8,9,
3> 1,2,3,6,7,8,9,
3> 5,6,7,9,
4> 1,2,3,6,7,9,
4> 5,6,9,
模式是否具有Evictor的概念?如何只保留特定的事件集。即。
1,2,3,4,
5,6,7,8,9,
答案 0 :(得分:0)
是的,您应该可以使用CEP执行此操作。您需要做的不仅仅是定义模式,还必须将模式应用于流,然后选择匹配的序列并使用它们发出一些结果。文档中有fairly complete example。