微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何仅一次调用即可清除整个MapSate状态

如何解决如何仅一次调用即可清除整个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 举报,一经查实,本站将立刻删除。