我有两个事件流
较低的索引表示时间戳...如果我们将两个流连接在一起并按时间对它们进行排序我们会得到:
是否可以实现自定义Window
/ Trigger
函数将事件分组到会话(不同用户登录之间的时间):
我看到的问题是两个流不一定是排序的。我想过按时间戳排序输入流。然后使用GlobalWindow
和自定义Trigger
实现窗口很容易 - 但似乎不可能。
我错过了什么,或者在当前的Flink(v1.3.2)中绝对不可能这样做?
由于
答案 0 :(得分:3)
问题:E3不应该在L4之前出现吗?
使用ProcessFunction
进行排序非常简单。像这样:
public static class SortFunction extends ProcessFunction<Event, Event> {
private ValueState<PriorityQueue<Event>> queueState = null;
@Override
public void open(Configuration config) {
ValueStateDescriptor<PriorityQueue<Event>> descriptor = new ValueStateDescriptor<>(
// state name
"sorted-events",
// type information of state
TypeInformation.of(new TypeHint<PriorityQueue<Event>>() {
}));
queueState = getRuntimeContext().getState(descriptor);
}
@Override
public void processElement(Event event, Context context, Collector<Event> out) throws Exception {
TimerService timerService = context.timerService();
if (context.timestamp() > timerService.currentWatermark()) {
PriorityQueue<Event> queue = queueState.value();
if (queue == null) {
queue = new PriorityQueue<>(10);
}
queue.add(event);
queueState.update(queue);
timerService.registerEventTimeTimer(event.timestamp);
}
}
@Override
public void onTimer(long timestamp, OnTimerContext context, Collector<Event> out) throws Exception {
PriorityQueue<Event> queue = queueState.value();
Long watermark = context.timerService().currentWatermark();
Event head = queue.peek();
while (head != null && head.timestamp <= watermark) {
out.collect(head);
queue.remove(head);
head = queue.peek();
}
}
}