为什么只使用一个globalwindow示例?

wkyowqbh  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(328)

看看这个例子:

// 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 .

tktrz96b

tktrz96b1#

Flink使用 Window 示例将属于同一窗口的元素组合在一起。但是,即使在之前,输入流也是根据指定的键分组的。所以flink在内部为每个键存储一个窗口及其相关元素的列表。这允许跨多个键使用同一窗口示例。
更准确地说,在内部有一个嵌套的 Map<Window, Map<Key, List<Element>> 每双鞋都有 Window 以及 Key a中的元素 List .
这种方法的好处是,键控流和非键控流上的窗口逻辑的实现没有区别。对于后一种情况,只需将键设置为伪值。

相关问题