相同的mapWithState几个JavaDStream使用的函数

时间:2016-08-23 08:35:10

标签: java apache-spark

我有2个JavaPairDStreams。它们具有相同的键(类型和值)和相同的值类型(不同的值)。我需要它们共享相同的状态以返回基于当前状态的结果,所以我使用相同的mapWithState函数。

JavaPairDStream<String, String> inputMessagesStream = readFromKafkaStream1();
JavaPairDStream<String, String> inputMessagesStream2 = readFromKafkaStream();
Function3<String, Optional<String>, State<MessageState>, String> messageState = (key, value, state) -> {
                if (state.exists()) {
                    return state.get().process(value.get());
                } else {
                    MessageState ms = new MessageState();
                    ms.process(value.get());
                    state.update(ms);
                    return null;
                }
            };

JavaMapWithStateDStream<String, String, MessageState, String> message1 = inputMessagesStream.mapWithState(StateSpec.function(messageState));
JavaMapWithStateDStream<String, String, MessageState, String> message2 = inputMessagesStream2.mapWithState(StateSpec.function(messageState));

对2个不同的流使用相同的功能是否可以?状态是否正确更新并由每个流共享?

2 个答案:

答案 0 :(得分:1)

您需要将inputMessagesStreaminputMessagesStream2合并为

JavaPairDStream<String, String> combinedStream = inputMessagesStream.union(inputMessagesStream2);

要区分上述两个流,您可以定义一些标志并将其添加到MapWithState

JavaMapWithStateDStream<String, String, MessageState, String> message = combinedStream.mapWithState(StateSpec.function(messageState));

它会起作用。

答案 1 :(得分:0)

是。此函数不会关闭状态(或其他任何东西),它会将其作为参数。因此,这两种用途将从不同的流中获得不同的状态。 mapWithState