如何解决如何仅一次调用即可清除整个MapSate状态
我知道,如果我执行mapState.clear()
,就可以将所有值清除为特定键的状态,但是我的问题是:有没有办法做类似mapState.clear()
和只需一次调用即可将所有状态清除到mapStates中?将类似于mapState.isEmpty()
之类的东西,它将说“ true”,因为清除了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()
将为一个用户清除整个属性/值对映射,而将其他映射留空。
我相信您是在问是否有某种方式可以一次为所有用户清除所有MapState。是的,有一种方法可以做到这一点,尽管它有点晦涩难懂,并且并非完全易于实现。
如果在此示例中将KeyedProcessFunction
更改为KeyedBroadcastProcessFunction
,并将广播流连接到用户事件流,则在该KeyedBroadcastProcessFunction
中,您可以使用{{3} processBroadcastElement()
方法中的}来遍历所有用户,并为每个用户清除其MapState。
只要您希望发生这种情况,就必须安排在广播流上发送事件。
关于使用广播状态,您应注意KeyedBroadcastProcessFunction.Context.html#applyToKeyedState。并且请记住,在所有并行实例中,在processBroadcastElement()
中实现的逻辑必须具有相同的确定性行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。