我试图理解可以在ProcessWindowFunction中使用的各种状态的差异。
首先,ProcessWindowFunction 是一个 AbstractRichFunction
abstract class ProcessWindowFunction[IN, OUT, KEY, W <: Window]
extends AbstractRichFunction {...}
因此,它可以使用
public RuntimeContext getRuntimeContext()
获取状态
getRuntimeContext().getState
此外,窗口处理函数的处理函数
def process(key: KEY, context: Context, elements: Iterable[IN], out:
Collector[OUT]) {}
有一个上下文,其中两个方法再次允许我获取状态:
/**
* State accessor for per-key and per-window state.
*/
def windowState: KeyedStateStore
/**
* State accessor for per-key global state.
*/
def globalState: KeyedStateStore
这是我的问题:
1( 这些与 getRuntimeContext((.getState 有什么关系?
2(我经常使用自定义触发器实现和全局窗口。在这种情况下,使用 getPartitionedState 检索状态。我是否可以在触发器函数中访问在窗口进程函数中定义的窗口状态?如果是这样,怎么办?
3(Trigger类中没有可以重写的开放方法,如何处理状态创建?只调用 getPartitionedState 是否安全,它也管理状态创建?
- 列表项
getRuntimeContext().getState
调用等效于ProcessWindowFunction.Context
的globalState
。两者都是"全局"状态,与windowState
的"窗口"状态相对。"全局"意味着状态在具有相同键的所有窗口之间共享。windowState
每个窗口都是独立的,即使对于相同的密钥也是如此。请记住,即使是"全局"状态也不会在不同的密钥之间共享。 - 在我看来,
TriggerContext#getPartitionedState()
和ProcessWindowFunction.Context#globalState()
指向同一件事。 - 基于代码和我发现的一个示例(
org.apache.flink.table.runtime.triggers.StateCleaningCountTrigger
(:是的,如果以前没有创建状态,getPartitionedState()
应该处理状态的创建。