2

看这个例子

// We create sessions for each id with max timeout of 3 time units
DataStream<Tuple3<String, Long, Integer>> aggregated = source
        .keyBy(0)
        .window(GlobalWindows.create())
        .trigger(new SessionTrigger(3L))
        .sum(2);

谁能解释我为什么在这个例子中使用GlobalWindow(created inside GlobalWindows#assignWindows) 的一个实例?

似乎对于任何传入的事件 ID,都应该创建自己的窗口,即Window(a)事件aWindow(b)事件b等,因为据我了解,Flink 正在使用 Window 的实例来关联对应的事件,例如,所有a事件都应该与之关联Window(a)。在这种情况下,只有所有aWindow(a)abGlobalWindow

4

1 回答 1

2

Flink 使用Window实例将属于同一窗口的元素组合在一起是正确的。但是,即使在之前,输入流也是根据指定的键进行分组的。因此,Flink 在内部为每个键存储了一个窗口列表及其相关元素。这允许跨多个键使用同一个窗口实例。

更准确地说,在内部你有一个嵌套Map<Window, Map<Key, List<Element>>的存储每一对WindowKeya 中的元素List

这种方法的好处是键控流和非键控流上的窗口逻辑的实现没有区别。对于后一种情况,您只需将键设置为虚拟值。

于 2016-03-30T10:04:46.623 回答