Java 卡夫卡流应用程序-计数和合计

Java 卡夫卡流应用程序-计数和合计,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我试图从KGroupedStream创建一个KTable来存储每个键的值的总和 final StreamsBuilder builder = new StreamsBuilder(); final KTable<String, Long> sum = builder.stream("streams-plaintext-input") .groupByKey() .aggregate(new Initializer<Long&g

我试图从KGroupedStream创建一个KTable来存储每个键的值的总和

 final StreamsBuilder builder = new StreamsBuilder();
 final KTable<String, Long> sum = builder.stream("streams-plaintext-input")
            .groupByKey()
            .aggregate(new Initializer<Long>() {
                @Override
                public Long apply() {
                    return Long.MIN_VALUE;
                }
            }, new Aggregator<String, Long, Long>() {
                @Override
                public Long apply(final String key, final Long value,final Long aggregate) {
                    aggregate += value;
                    return aggregate;
                }
            }, Materialized.<String, Long, KeyValueStore<Byte, byte[]>>as("counts-store"));
final StreamsBuilder builder=new StreamsBuilder();
最终KTable sum=builder.stream(“流明文输入”)
.groupByKey()
.aggregate(新初始值设定项(){
@凌驾
公共长期应用(){
返回Long.MIN_值;
}
},新聚合器(){
@凌驾
公共长应用(最终字符串键、最终长值、最终长聚合){
合计+=价值;
总回报;
}
},具体化为(“计数存储”);
但是我得到了一个错误:

The method aggregate(Initializer<VR>, Aggregator<? super Object,? super Object,VR>, Materialized<Object,VR,KeyValueStore<Bytes,byte[]>>) in the type KGroupedStream<Object,Object> is not applicable for the arguments (new Initializer<Long>(){}, new Aggregator<String,Long,Long>(){}, Materialized<String,Long,KeyValueStore<Byte,byte[]>>)

方法聚合(初始值设定项、聚合器您的代码中很少有问题:

  • 对于
    Materialized.as
    而不是
    java.lang.Byte
    您应该传递
    org.apache.kafka.common.utils.Bytes
  • 您不应该修改
    final
    变量:
    aggregate+=value;
  • 您必须向
    StreamsBuilder::stream
    调用(
    builder.stream(“streams明文输入”)
    )添加键和值的类型
  • 修改后,应大致如下所示:

    KTable sum=builder.stream(“流明文输入”)
    .groupByKey()
    .aggregate(新初始值设定项(){
    @凌驾
    公共长期应用(){
    返回Long.MIN_值;
    }
    },新聚合器(){
    @凌驾
    公共长应用(最终字符串键、最终长值、最终长聚合){
    返回聚合+值;
    }
    },具体化为(“计数存储”);
    
    太棒了,非常感谢。3是根本原因,现在已经很明显了!1我已经在做了(代码片段中不清楚)。2在我修复3后出现。再次感谢备注:要计算总和,初始值应该是零,而不是
    长。要计算正确的结果,最小值
    。计数类似。
    final StreamsBuilder builder = new StreamsBuilder();
        final KTable<String, Long> sum = builder.stream("streams-plaintext-input")
                .groupByKey()
                .aggregate(new Initializer<Long>() {
                    @Override
                    public Long apply() {
                        return Long.MIN_VALUE;
                    }
                }, new Aggregator<String, Long, Long>() {
                    @Override
                    public Long apply(final String key, final Long value,final Long aggregate) {
                        aggregate += value;
                        return aggregate;
                    }
                }, Serdes.Long());
    
    The method aggregate(Initializer<VR>, Aggregator<? super Object,? super Object,VR>, Materialized<Object,VR,KeyValueStore<Bytes,byte[]>>) in the type KGroupedStream<Object,Object> is not applicable for the arguments (new Initializer<Long>(){}, new Aggregator<String,Long,Long>(){}, Serde<Long>)