我有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个不同的流使用相同的功能是否可以?状态是否正确更新并由每个流共享?
答案 0 :(得分:1)
您需要将inputMessagesStream
和inputMessagesStream2
合并为
JavaPairDStream<String, String> combinedStream = inputMessagesStream.union(inputMessagesStream2);
要区分上述两个流,您可以定义一些标志并将其添加到MapWithState
JavaMapWithStateDStream<String, String, MessageState, String> message = combinedStream.mapWithState(StateSpec.function(messageState));
它会起作用。
答案 1 :(得分:0)
是。此函数不会关闭状态(或其他任何东西),它会将其作为参数。因此,这两种用途将从不同的流中获得不同的状态。 mapWithState
。