toStream () не работает на Windowed KTable - PullRequest
1 голос
/ 14 июня 2019

Я хочу написать небольшое приложение Kafka Streams, которое сокращает временные окна входного потока, выполняет некоторое сопоставление значений и затем отправляет полученный журнал изменений toStream () в другую тему. С моим кодом я получаю следующую ошибку при операции toStream ():

Compilation failure
[ERROR] StreamFilter.java:[39,86] incompatible types: org.apache.kafka.streams.kstream.KStream<org.apache.kafka.streams.kstream.Windowed<java.lang.Integer>,filterExample.SensorMessage> cannot be converted to org.apache.kafka.streams.kstream.KStream<java.lang.Integer,filterExample.SensorMessage>

Я где-то читал, что проблема может быть в Serdes по умолчанию, но пока, включая их явно с Consumed.with, не решил проблему.

public static void runStreamFilter(String broker) throws Exception {
  final SensorMessageSerializer serializer = new SensorMessageSerializer();
  final SensorMessageDeserializer deserializer = new SensorMessageDeserializer();
  Properties props = new Properties();
  props.put(StreamsConfig.APPLICATION_ID_CONFIG, "stream-filter");
  props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, broker);
  props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.Integer().getClass());
  props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.serdeFrom(serializer, deserializer));

  final StreamsBuilder builder = new StreamsBuilder();

  final KStream<Integer, SensorMessage> input = builder.stream(KafkaConstants.TOPIC_IN, Consumed.with(Serdes.Integer(), Serdes.serdeFrom(serializer, deserializer)));
  final KStream<Integer, SensorMessage> output = input
    .filter((k,v) -> v.getValue() > 19) 
    .groupByKey(Grouped.with(Serdes.Integer(), Serdes.serdeFrom(serializer, deserializer)))
    .windowedBy(TimeWindows.of(Duration.ofMillis(500)))
    .reduce((aggValue, newValue) -> avgReducer(aggValue, newValue))
    .mapValues(value -> latencyMapper(value))
    .toStream();


  output.to(KafkaConstants.TOPIC_OUT);

1 Ответ

4 голосов
/ 14 июня 2019

код .windowedBy(TimeWindows.of(Duration.ofMillis(500))).reduce(..) возвращает KTable<Windowed<K>, V>.

чтобы преобразовать ваш результат в KStream<Integer, SensorMessage>, вам нужно извлечь значение из Windowed объекта, поэтому вам нужно добавить следующий код после toStream():

.map((key, value) -> KeyValue.pair(key.key(), value));

...