将总和存储在KTable <String,Integer>中

时间:2019-06-26 10:49:22

标签: apache-kafka apache-kafka-streams

我正在尝试计算一个主题的信封数量。交易采用avro格式。我以this example作为参考。

final StreamsBuilder streamsBuilder = new StreamsBuilder();
final KStream<String, Transaction> transactionKStream = streamsBuilder.stream(INPUT_TOPIC);

final KStream<String, Integer> envelopes = transactionKStream.filter((k, v) -> v.getProduct().toString()
    .matches("C4|C5"))
    .map((k, v) -> KeyValue.pair("1", v.getAmount()));

final KTable<String, Integer> amount = envelopes
    .groupByKey()
    .reduce((v1, v2) -> v1 + v2);

我想将总和存储在KTable <>中,但是当我将数据发送到输入主题时,消费者崩溃

A serializer (key: org.apache.kafka.common.serialization.StringSerializer / value: io.confluent.kafka.streams.serdes.avro.GenericAvroSerializer) is not compatible to the actual key or value type (key type: java.lang.String / value type: java.lang.Integer). Change the default Serdes in StreamConfig or provide correct Serdes via method parameters.

注释KTable <>时,它运行良好。但是不要加总金额。

1 个答案:

答案 0 :(得分:2)

groupByKey()使用默认的序列化器:

  

groupByKey()

     

按记录的当前键将记录分组为一个   KGroupedStream保留原始值和默认值   序列化器和反序列化器。

您必须使用groupByKey(Serialized<K,V> serialized)groupByKey(Grouped<K,V> grouped)

以下应该可以解决问题:

final KTable<String, Integer> amount = envelopes
    .groupByKey(Serialized.with(Serdes.String(), Serdes.Integer()))
    .reduce((v1, v2) -> v1 + v2);