如何仅一次调用即可清除整个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()中实现的逻辑必须具有相同的确定性行为。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...