我有一个按键事件进入一个流,该事件我想按键累积,直到超时(例如5分钟),然后处理直到该点为止的事件(并忽略该键之后的所有内容) ,但首先要注意)。
我是Flink的新手,但从概念上讲,我认为我需要类似下面的代码。
DataStream<Tuple2<String, String>> dataStream = see
.socketTextStream("localhost", 9999)
.flatMap(new Splitter())
.keyBy(0)
.window(GlobalWindows.create())
.trigger(ProcessingTimeTrigger.create()) // how do I set the timeout value?
.fold(new Tuple2<>("", ""), new FoldFunction<Tuple2<String, String>, Tuple2<String, String>>() {
public Tuple2<String, String> fold(Tuple2<String, String> agg, Tuple2<String, String> elem) {
if ( agg.f0.isEmpty()) {
agg.f0 = elem.f0;
}
if ( agg.f1.isEmpty()) {
agg.f1 = elem.f1;
} else {
agg.f1 = agg.f1 + "; " + elem.f1;
}
return agg;
}
});
此代码无法编译,因为ProcessingTimeTrigger需要一个TimeWindow,而GlobalWindow不是TimeWindow。所以...
如何在Flink中完成键控窗口超时?
答案 0 :(得分:0)
如果您使用output$courseData = renderTable(rownames=TRUE, {
data = mtcars
c1 = input$course1
c2 = input$course2
tbl = as.data.frame.matrix(table(data[[c1]], data[[c2]]))
tbl})
}
来解决这个问题,那么您将会轻松得多。
我建议在KeyedProcessFunction的open()方法中建立一个键控KeyedProcessFunction
项。在processElement()方法中,如果列表为空,则当您希望窗口结束时,设置要触发的处理时间计时器(相对于当前时间的每个按键计时器)。然后将传入事件添加到列表中。
当计时器触发时,将调用onTimer()方法,您可以遍历列表,产生结果并清除列表。
要安排每个键仅执行一次所有这些操作,请在KeyedProcessFunction中添加ListState
以跟踪此情况。 (请注意,如果您的密钥空间是无限的,则应考虑一种最终使过时密钥的状态过期的策略。)
文档描述了如何使用Process Functions和how to work with state。您可以在Flink培训网站上找到其他示例,例如this exercise。