Java 如何从kafka流获取窗口聚合?

Java 如何从kafka流获取窗口聚合?,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,我有一个事件流,我想根据时间窗口聚合这些事件。我的解决方案提供增量聚合,而不是在定时窗口上提供聚合。我已经读到,这对于流来说是正常的,因为它会以更改日志的形式给出结果。在研究过程中,我也遇到了一些问题。但第一篇文章中的解决方案有些过时(使用不推荐的API)。我使用了那些不推荐使用的API中建议的新API。这是我的解决方案 KStream<String, Event> eventKStream = summarizableData.mapValues(v -> v.getEven

我有一个事件流,我想根据时间窗口聚合这些事件。我的解决方案提供增量聚合,而不是在定时窗口上提供聚合。我已经读到,这对于流来说是正常的,因为它会以更改日志的形式给出结果。在研究过程中,我也遇到了一些问题。但第一篇文章中的解决方案有些过时(使用不推荐的API)。我使用了那些不推荐使用的API中建议的新API。这是我的解决方案

KStream<String, Event> eventKStream = summarizableData.mapValues(v -> v.getEvent());
    KGroupedStream<String, Event> kGroupedStream = eventKStream.groupBy((key, value) -> {
             String groupBy = getGroupBy(value, criteria);
             return groupBy;
    }, Serialized.with(Serdes.String(), eventSerde));


    long windowSizeMs = TimeUnit.SECONDS.toMillis(applicationProperties.getWindowSizeInSeconds());
    final TimeWindowedKStream<String, Event> groupedByKeyForWindow = kGroupedStream
            .windowedBy(TimeWindows.of(windowSizeMs)
                    .advanceBy(windowSizeMs));
KStream eventKStream=summableddata.mapValues(v->v.getEvent());
KGroupedStream KGroupedStream=eventKStream.groupBy((键,值)->{
字符串groupBy=getGroupBy(值、条件);
返回分组;
},序列化为.with(Serdes.String(),eventSerde));
long windowSizeMs=TimeUnit.SECONDS.toMillis(applicationProperties.getWindowSizeInSeconds());
最终时间WindowedkStream groupedByKeyForWindow=kGroupedStream
.windowedBy(TimeWindows.of(windowSizeMs)
.advanceBy(windowSizeMs));

但正如我前面解释的,我的结果不是在特定的时间窗口中给出的,而是作为增量聚合给出的。我需要按照WindowsSize中指定的时间输出数据。我还了解到,
CACHE\u MAX\u BYTES\u BUFFERING\u CONFIG
可以控制输出,但我需要某种可靠的解决方案来解决每种情况。还要注意,wiki中给出的模式现在已经过时,因为它使用了旧的api。(我正在使用kafka streams 1.1.0版本)

问题是我的错误。上面的代码示例运行良好。但最后我将
KTable
转换为
KStream
。这就是问题所在。转换到
KStream
也会导致输出中间结果。图中给出的图案效果很好。有问题的代码是

// Aggregation

KTable<Windowed<String>, Event> results = groupedByKeyForWindow.aggregate(new AggregateInitiator(), new EventAggregator());

// This converstion causing changelog to output. Instead use next line.
KStream<String, AggregationMessage> aggregationMessageKStream = results.toStream((key, value) -> key.toString())
                .mapValues(this::convertToAggregationMessage).filter((k, v) -> v != null);

// output KTable to sample topic. But this output controlled by 
// COMMIT_INTERVAL_MS_CONFIG and CACHE_MAX_BYTES_BUFFERING_CONFIG parameters. 
// I'm using default values for these params.
results.to(windowedSerde, eventSerde,  "Sample");
//聚合
KTable results=groupedByKeyForWindow.aggregate(新的AggregateInitiator(),新的EventAggregator());
//此对话导致输出changelog。而是使用下一行。
KStream aggregationMessageKStream=results.toStream((键,值)->key.toString()
.mapValues(this::convertToAggregationMessage).filter((k,v)->v!=null);
//输出KTable到示例主题。但是这个输出是由
//提交间隔配置和缓存最大字节缓冲配置参数。
//我正在为这些参数使用默认值。
结果。至(windowedSerde,eventSerde,“样本”);