我知道,如果我执行mapState.clear()
,我将能够将所有值清除到特定键的状态中,但我的问题是:有没有一种方法可以执行类似mapState.clear()
的操作,只需一次调用即可将所有状态清除到mapStates中?将类似于CCD_ 3;真";因为mapState中的所有密钥都已清理,而不仅仅是当前密钥。
谢谢。谨致问候!
因为我们谈论的是嵌套映射的情况,所以很容易混淆我们的术语。让我们把这个问题放在一个例子的上下文中。
假设您有一个关于用户的事件流,并且在KeyedProcessFunction
中,您使用MapState<ATTR, VALUE>
为每个用户维护属性/值对的映射:
userEvents
.keyBy(e -> e.userId)
.process(new ManageUserData())
在流程函数中,任何时候使用MapState,您都只能为用户操作与正在处理的事件相对应的一个映射,
public static class ManageUserData extends KeyedProcessFunction<...> {
MapState<ATTR, VALUE> userMap;
}
因此userMap.clear()
将清除一个用户的属性/值对的整个映射,而不使用其他映射。
我相信你在问是否有办法同时为所有用户清除所有MapStates。是的,有一种方法可以做到这一点,尽管它有点晦涩,而且实现起来并不完全简单。
如果您将本例中的KeyedProcessFunction
更改为KeyedBroadcastProcessFunction
,并将广播流连接到用户事件流,那么在该KeyedBroadcastProcessFunction
中,您可以在processBroadcastElement()
方法内部使用KeyedBroadcastProcessFunction.Context.html#applyToKeyedState来迭代所有用户,并为每个用户清除其MapState。
你必须安排在广播流上发送一个事件,只要你想这样做。
您应该注意文档中关于使用广播状态的警告。请记住,processBroadcastElement()
中实现的逻辑在所有并行实例中必须具有相同的确定性行为。