Java 卡夫卡流应用程序-计数和合计
我试图从KGroupedStream创建一个KTable来存储每个键的值的总和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
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>)