因为我们讨论的是嵌套地图的情况,所以很容易混淆我们的术语。所以让我们把这个问题放到一个例子的上下文中。
假设您有一个关于用户的事件流,并且在 KeyedProcessFunction 中使用 MapState<ATTR, VALUE> 来维护每个用户的属性/值对的映射:
userEvents
.keyBy(e -> e.userId)
.process(new ManageUserData())
在 process 函数中,任何时候使用 MapState 都只能为正在处理的事件对应的用户操作一张地图,
public static class ManageUserData extends KeyedProcessFunction<...> {
MapState<ATTR, VALUE> userMap;
}
所以userMap.clear() 将清除一个用户的整个属性/值对映射,但不理会其他映射。
我相信您在问是否有某种方法可以一次清除所有用户的所有 MapState。是的,有一种方法可以做到这一点,虽然它有点晦涩难懂,而且实现起来并不完全简单。
如果您将本例中的KeyedProcessFunction 更改为KeyedBroadcastProcessFunction,并将广播流连接到用户事件流,则在该KeyedBroadcastProcessFunction 中,您可以在processBroadcastElement() 方法中使用KeyedBroadcastProcessFunction.Context.html#applyToKeyedState遍历所有用户,并为每个用户清除他们的 MapState。
您必须随时安排在广播流上发送事件。
您应该注意warnings in the documentation 关于处理广播状态的信息。请记住,processBroadcastElement() 中实现的逻辑必须在所有并行实例中具有相同的确定性行为。