如何通过一次调用清除整个 MapSate 状态

How to clear the whole MapSate state with only one call

我知道如果我这样做 mapState.clear() 我将能够将所有值清除到特定键的状态中,但我的问题是:有没有办法做类似 mapState.clear() 并通过一次调用将所有状态清理到 mapStates 中?将类似于 mapState.isEmpty() 它会说“真”,因为 mapState 中的所有键都已清理,而不仅仅是当前键。

谢谢。 亲切的问候!

因为我们讨论的是嵌套地图的情况,所以很容易混淆我们的术语。那么让我们把这个问题放到一个例子的上下文中。

假设您有一个关于用户的事件流,并且在 KeyedProcessFunction 中您正在使用 MapState<ATTR, VALUE> 为每个用户维护一个 attribute/value 对的映射:

userEvents
    .keyBy(e -> e.userId)
    .process(new ManageUserData())

在 process 函数中,任何时候使用 MapState 时,您只能为与正在处理的事件对应的用户操作一张地图,

public static class ManageUserData extends KeyedProcessFunction<...> {
    MapState<ATTR, VALUE> userMap;
}

所以 userMap.clear() 将为一个用户清除 attribute/value 对的整个地图,但保留其他地图。

我相信您是在问是否有某种方法可以一次性清除所有用户的所有 MapState。是的,有一种方法可以做到这一点,尽管它有点晦涩难懂,而且实施起来并不完全直接。

如果您将此示例中的 KeyedProcessFunction 更改为 KeyedBroadcastProcessFunction,并将广播流连接到用户事件流,那么在 KeyedBroadcastProcessFunction 中您可以使用 KeyedBroadcastProcessFunction.Context.html#applyToKeyedStateprocessBroadcastElement() 方法中迭代所有用户,并为每个用户清除他们的 MapState。

您必须安排在广播流上发送事件,只要您希望发生这种情况。

关于使用广播状态,您应该注意 warnings in the documentation。请记住,processBroadcastElement() 中实现的逻辑必须在所有并行实例中具有相同的确定性行为。