看看这个example:
// 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
的一个实例(在GlobalWindows#assignWindows
内创建)?
似乎应为任何传入的事件ID创建自己的窗口,即Window(a)
事件为a
,Window(b)
事件为b
等,因为我了解Flink是使用Window的实例作为关联对应事件,例如,所有a
事件应该与Window(a)
相关联。在这种情况下,只有与a
相关联的所有Window(a)
事件将被传递到窗口函数并一起处理(在此示例中将计算按ID分组的事件的计数,即a
,{{ 1}}等等,但正如您可以使用b
的一个实例看到此示例。
答案 0 :(得分:2)
Flink使用Window
实例将属于同一窗口的元素分组在一起是正确的。但是,甚至在此之前,输入流根据指定的密钥进行分组。因此,内部Flink为每个键存储一个窗口列表及其相关元素。这允许跨多个键使用相同的窗口实例。
更准确地说,在内部,您有一个嵌套的Map<Window, Map<Key, List<Element>>
,用于存储Window
中每对Key
和List
的元素。
这种方法的好处是键控流和非键控流上的窗口逻辑的实现没有区别。对于后一种情况,您只需将密钥设置为虚拟值。