Join 是否可以在MapState中拥有地图的地图?

Join 是否可以在MapState中拥有地图的地图?,join,streaming,apache-flink,flink-streaming,Join,Streaming,Apache Flink,Flink Streaming,您共享的代码很难理解,但可能您误解了MapState是什么。ValueState提供了一个分片键/值存储,分布在集群中。MapState为您提供分片键/值存储,其中值本身是嵌套的映射 换句话说,MapState始终是地图的地图。您最终尝试创建一个地图地图地图地图-这是一个级别太远了 我假设您正在尝试构建此结构,其中您有效地拥有从实验名称到时间戳到事件的嵌套映射的映射: name->(时间->事件) 假设您的事件流已经由实验名称键入,那么您真正想要的不是使用MapState eventsMap,而

您共享的代码很难理解,但可能您误解了MapState是什么。ValueState提供了一个分片键/值存储,分布在集群中。MapState为您提供分片键/值存储,其中值本身是嵌套的映射

换句话说,MapState始终是地图的地图。您最终尝试创建一个地图地图地图地图-这是一个级别太远了

我假设您正在尝试构建此结构,其中您有效地拥有从实验名称到时间戳到事件的嵌套映射的映射:

name->(时间->事件)

假设您的事件流已经由实验名称键入,那么您真正想要的不是使用
MapState eventsMap
,而是
MapState eventsMap
,而不是

eventsMap.get(name).put(event.getEventTime(),event);
你应该做什么

eventsMap.put(event.getEventTime(),event);

有关如何使用这些机制的更多背景信息,请参阅和中的Flink文档。

代码看起来是正确的,我不认为它会导致更新出现问题,因此很可能存在其他问题。我已使用另一种方法更新了描述(尽管效率较低)这是可行的。你是如何为连接的两个流设置关键帧的?是的,它们设置了关键帧。正如您在下面提到的,这可能是由于不同的并行性设置造成的问题吗?您关于“从实验名称到时间戳到事件的嵌套映射”的看法是正确的。但是我的事件被设置在不同的属性上。所以我需要为多个名称维护这个结构。此外,我无法将此属性移动到键中,因为我正在处理两个流的连接,而另一个流没有此属性。您是否考虑过进行广播连接?在某些情况下,这会表现得更好。我没有。让我看看。至于MapState,我只是想知道这是否会起作用,或者我可能会遗漏一些东西。同样令人困惑的是,同样的代码在本地Flink应用程序上有效,但在集群中无效。您是否更改了在本地和集群中运行时的并行度?
private MapState<String, EventsHistory> eventsMap = null;
 
public void processElement2(Event event,
                            Context context,
                            Collector<JoinedEvent> collector) throws Exception {
    String name = event.getExperimentName();
    if (eventsMap.get(name) == null) {
         eventsMap.put(name, new EventsHistory());
    }
    eventsMap.get(name).put(event.getEventTime(), event);
}

class EventsHistory {

    private final Map<Long, Event> events = new HashMap<>();

    public Map<Long, Event> getEvents() {
        return events;
    }

    public void put(final Long eventTime, final Event event) {
        events.put(eventTime, event);
    }
}
private MapState<EventKey, Event> assignmentEventsMap = null;

public final class EventKey {

    private String name;
    private long eventTime;
}

    public void processElement2(Event event,
                                Context context,
                                Collector<JoinedEvent> collector) throws Exception {
        String name = event.getExperimentName();
        eventsMap
                .put(new EventKey(event.getName(), event.getEventTime()),
                        event);
    }