Apache flink GlobalWindows在Flink中的同一个GlobalWindows中分配具有相同键的元素?

Apache flink GlobalWindows在Flink中的同一个GlobalWindows中分配具有相同键的元素?,apache-flink,flink-streaming,Apache Flink,Flink Streaming,根据下面的文档“全局窗口赋值器将具有相同键的所有元素分配给同一个全局窗口” 然后我检查了源代码,发现GlobalWindows的assignWindows方法只返回全局窗口,没有对参数元素做任何操作,那么如何将具有相同键的所有元素分配到同一个全局窗口呢 @覆盖 公共集合assignWindows(对象元素、长时间戳、WindowAssignerContext上下文){ 返回Collections.singletonList(GlobalWindow.get()); } 在Flink中,窗口和

根据下面的文档“全局窗口赋值器将具有相同键的所有元素分配给同一个全局窗口”

然后我检查了源代码,发现GlobalWindows的assignWindows方法只返回全局窗口,没有对参数元素做任何操作,那么如何将具有相同键的所有元素分配到同一个全局窗口呢

@覆盖
公共集合assignWindows(对象元素、长时间戳、WindowAssignerContext上下文){
返回Collections.singletonList(GlobalWindow.get());
}

在Flink中,窗口和键在很大程度上是相互独立的。流元素可以按键和窗口进行分组,它们是正交维度。(当我们想讨论窗口与键的组合时,这称为窗格。)

窗口实例没有键,窗口赋值器也没有。相反,键和键分区状态是计算窗口的运行时上下文的一部分

当我试图理解键与窗口赋值器的关系时,我发现通读下面的内容很有帮助。当每个流元素到达窗口操作符时,调用此代码。注意键的作用,同时忽略许多其他细节,我们看到:

public void processElement(StreamRecord<IN> element) throws Exception {
    final Collection<W> elementWindows = windowAssigner.assignWindows(
        element.getValue(), element.getTimestamp(), windowAssignerContext);

    ...

    final K key = this.<K>getKeyedStateBackend().getCurrentKey();

    ...

    for (W window: elementWindows) {

        ...

        windowState.add(element.getValue());

        triggerContext.key = key;
        triggerContext.window = window;

        TriggerResult triggerResult = triggerContext.onElement(element);
        if (triggerResult.isFire()) {
            ...
            emitWindowContents(window, contents);
        }

        ...
    }
}
public void processElement(StreamRecord元素)引发异常{
最终集合元素Windows=windowAssigner.assignWindows(
element.getValue()、element.getTimestamp()、windowAssignerContext);
...
final K key=this.getKeyedStateBackend().getCurrentKey();
...
用于(W窗口:元素窗口){
...
添加(element.getValue());
triggerContext.key=key;
triggerContext.window=窗口;
TriggerResult TriggerResult=triggerContext.OneElement(元素);
if(triggerResult.isFire()){
...
emitWindowContents(窗口,内容);
}
...
}
}
在这里,您可以看到,该键可通过getKeyedStateBend()供窗口操作符使用,但在从窗口赋值器获取该元素的窗口之前,该键甚至不会被检索。窗口赋值器执行其工作时不需要考虑任何键


不过,稍后会提取密钥,以便触发器可以通过触发器上下文使用它。

在Flink中,窗口和密钥在很大程度上是相互独立的。流元素可以按键和窗口进行分组,它们是正交维度。(当我们想讨论窗口与键的组合时,这称为窗格。)

窗口实例没有键,窗口赋值器也没有。相反,键和键分区状态是计算窗口的运行时上下文的一部分

当我试图理解键与窗口赋值器的关系时,我发现通读下面的内容很有帮助。当每个流元素到达窗口操作符时,调用此代码。注意键的作用,同时忽略许多其他细节,我们看到:

public void processElement(StreamRecord<IN> element) throws Exception {
    final Collection<W> elementWindows = windowAssigner.assignWindows(
        element.getValue(), element.getTimestamp(), windowAssignerContext);

    ...

    final K key = this.<K>getKeyedStateBackend().getCurrentKey();

    ...

    for (W window: elementWindows) {

        ...

        windowState.add(element.getValue());

        triggerContext.key = key;
        triggerContext.window = window;

        TriggerResult triggerResult = triggerContext.onElement(element);
        if (triggerResult.isFire()) {
            ...
            emitWindowContents(window, contents);
        }

        ...
    }
}
public void processElement(StreamRecord元素)引发异常{
最终集合元素Windows=windowAssigner.assignWindows(
element.getValue()、element.getTimestamp()、windowAssignerContext);
...
final K key=this.getKeyedStateBackend().getCurrentKey();
...
用于(W窗口:元素窗口){
...
添加(element.getValue());
triggerContext.key=key;
triggerContext.window=窗口;
TriggerResult TriggerResult=triggerContext.OneElement(元素);
if(triggerResult.isFire()){
...
emitWindowContents(窗口,内容);
}
...
}
}
在这里,您可以看到,该键可通过getKeyedStateBend()供窗口操作符使用,但在从窗口赋值器获取该元素的窗口之前,该键甚至不会被检索。窗口赋值器执行其工作时不需要考虑任何键


不过,稍后会提取密钥,以便触发器可以通过触发器上下文使用该密钥。

非常感谢,因此,首先将要出现的元素通过windowAssigner.assignWindows获取自己所属的一个或多个窗口,然后通过GetKeyedStateBend获取密钥,然后通过WindowsState.add将该元素添加到一个或多个窗口中(element.getValue());,我的理解正确吗?名称空间的含义是什么?为什么我们需要这个句子WindowsState.setCurrentNamespace(window);?非常感谢,因此首先,即将出现的元素通过windowAssigner.assignWindows获取其自己所属的一个或多个窗口,然后通过GetKeyedStateBend获取密钥,然后通过WindowsState.add(element.getValue())将元素添加到一个或多个窗口中,我的理解正确吗?名称空间的含义是什么?为什么我们需要这个句子windowState.setCurrentNamespace(window);?