为什么只使用了一个 GlobalWindow 实例?
Why is only one instance of GlobalWindow used?
看看这个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,即 Window(a)
用于 a
事件,Window(b)
用于 b
事件,等等。因为据我所知,Flink 正在使用 Window 的实例来关联对应的事件,即所有 a
事件都应该与 Window(a)
相关联。在这种情况下,只有与 Window(a)
关联的所有 a
事件将传递给 window 函数并一起处理(在此示例中,将计算按 ID 分组的事件计数,即按 a
, b
, 等等),但是正如您所看到的,这个示例使用了 GlobalWindow
.
的一个实例
Flink 使用Window
个实例将属于相同window 的元素分组在一起是正确的。然而,即使在此之前,输入流也是根据指定的键进行分组的。因此,Flink 在内部为每个键存储了一个 windows 及其关联元素的列表。这允许跨多个键使用相同的 window 实例。
更准确地说,在内部你有一个嵌套的 Map<Window, Map<Key, List<Element>>
,它为每对 Window
和 Key
存储 List
.[=15 中的元素=]
这种方法的好处是 windowing 逻辑在键控流和非键控流上的实现没有区别。对于后一种情况,您只需将密钥设置为虚拟值即可。
看看这个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,即 Window(a)
用于 a
事件,Window(b)
用于 b
事件,等等。因为据我所知,Flink 正在使用 Window 的实例来关联对应的事件,即所有 a
事件都应该与 Window(a)
相关联。在这种情况下,只有与 Window(a)
关联的所有 a
事件将传递给 window 函数并一起处理(在此示例中,将计算按 ID 分组的事件计数,即按 a
, b
, 等等),但是正如您所看到的,这个示例使用了 GlobalWindow
.
Flink 使用Window
个实例将属于相同window 的元素分组在一起是正确的。然而,即使在此之前,输入流也是根据指定的键进行分组的。因此,Flink 在内部为每个键存储了一个 windows 及其关联元素的列表。这允许跨多个键使用相同的 window 实例。
更准确地说,在内部你有一个嵌套的 Map<Window, Map<Key, List<Element>>
,它为每对 Window
和 Key
存储 List
.[=15 中的元素=]
这种方法的好处是 windowing 逻辑在键控流和非键控流上的实现没有区别。对于后一种情况,您只需将密钥设置为虚拟值即可。