我尝试了解 ProcessWindowFunction 中可以使用的各种状态的差异。
首先,ProcessWindowFunction是一个AbstractRichFunction
abstract class ProcessWindowFunction[IN, OUT, KEY, W <: Window]
extends AbstractRichFunction {...}
Run Code Online (Sandbox Code Playgroud)
因此它可以使用该方法
public RuntimeContext getRuntimeContext()
Run Code Online (Sandbox Code Playgroud)
获得一个状态
getRuntimeContext().getState
Run Code Online (Sandbox Code Playgroud)
更多,WindowProcessFunction的处理函数
def process(key: KEY, context: Context, elements: Iterable[IN], out:
Collector[OUT]) {}
Run Code Online (Sandbox Code Playgroud)
有一个上下文,其中又有两种方法允许我获取状态:
/**
* State accessor for per-key and per-window state.
*/
def windowState: KeyedStateStore
/**
* State accessor for per-key global state.
*/
def globalState: KeyedStateStore
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
1)这些与 getRuntimeContext().getState 有什么关系?
2)我经常使用自定义触发器实现和全局窗口。在这种情况下,使用 getPartitionedState 检索状态。我可以在触发函数中访问 WindowProcessFunction 中定义的窗口状态吗?如果是这样怎么办?
3)Trigger类中没有可以重写的open方法,状态创建是如何处理的?只调用 getPartitionedState 是否安全,它还管理状态创建?
getRuntimeContext().getState调用globalState相当于ProcessWindowFunction.Context. 两者都是“全局”状态,与 的“窗口”状态相反windowState。“全局”意味着状态在具有相同密钥的所有窗口之间共享。windowState每个窗口都是独立的,即使对于相同的密钥也是如此。请记住,即使是“全局”状态也不会在不同的键之间共享。TriggerContext#getPartitionedState()和 都ProcessWindowFunction.Context#globalState()指向同一件事。org.apache.flink.table.runtime.triggers.StateCleaningCountTrigger):是的,getPartitionedState()如果之前未创建状态,则应该处理状态的创建。| 归档时间: |
|
| 查看次数: |
1869 次 |
| 最近记录: |