如何通过一次调用清除整个 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#applyToKeyedState 在 processBroadcastElement()
方法中迭代所有用户,并为每个用户清除他们的 MapState。
您必须安排在广播流上发送事件,只要您希望发生这种情况。
关于使用广播状态,您应该注意 warnings in the documentation。请记住,processBroadcastElement()
中实现的逻辑必须在所有并行实例中具有相同的确定性行为。
我知道如果我这样做 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#applyToKeyedState 在 processBroadcastElement()
方法中迭代所有用户,并为每个用户清除他们的 MapState。
您必须安排在广播流上发送事件,只要您希望发生这种情况。
关于使用广播状态,您应该注意 warnings in the documentation。请记住,processBroadcastElement()
中实现的逻辑必须在所有并行实例中具有相同的确定性行为。