我试着理解可以在ProcessWindowFunction中使用的各种状态的区别。
首先,ProcessWindowFunction是一个AbstractRichFunction
abstract class ProcessWindowFunction[IN, OUT, KEY, W <: Window]
extends AbstractRichFunction {...}
因此可以使用方法
public RuntimeContext getRuntimeContext()
获得州
getRuntimeContext().getState
Morevoer,WindowProcessFunction的处理功能
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)我经常使用自定义Trigger实现和GlobalWindow。在这种情况下,使用getPartitionedState检索状态。我是否也可以在触发器函数中访问WindowProcessFunction中定义的窗口状态?如果是这样的话?
3)Trigger类中没有open方法可以覆盖,如何处理状态创建?只调用getPartitionedState是否安全,它还管理状态创建?
答案 0 :(得分:2)
getRuntimeContext().getState
来电相当于globalState
的{{1}}。两者都是“全球”状态,与ProcessWindowFunction.Context
的“窗口”状态相对立。 “全局”意味着在具有相同密钥的所有窗口之间共享状态。每个窗口windowState
是独立的,即使对于同一个密钥也是如此。请记住,即使是“全局”状态也不会在不同的密钥之间共享。windowState
和TriggerContext#getPartitionedState()
指的是同一件事。ProcessWindowFunction.Context#globalState()
):是的,如果之前没有创建状态,org.apache.flink.table.runtime.triggers.StateCleaningCountTrigger
应该处理创建状态。