看看这个例子:
// 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示例来关联相应的事件,即all a
事件应与 Window(a)
例如。在这种情况下,只有所有 a
与关联的事件 Window(a)
将传递给窗口函数并一起处理(在本例中,将计算按id分组的事件计数,即按 a
, b
,等等),但是您可以看到这个示例使用 GlobalWindow
.
1条答案
按热度按时间tktrz96b1#
Flink使用
Window
示例将属于同一窗口的元素组合在一起。但是,即使在之前,输入流也是根据指定的键分组的。所以flink在内部为每个键存储一个窗口及其相关元素的列表。这允许跨多个键使用同一窗口示例。更准确地说,在内部有一个嵌套的
Map<Window, Map<Key, List<Element>>
每双鞋都有Window
以及Key
a中的元素List
.这种方法的好处是,键控流和非键控流上的窗口逻辑的实现没有区别。对于后一种情况,只需将键设置为伪值。