Java 如何仅在窗口完成时将窗口聚合结果发送到输出主题?
我在进行窗口聚合时遇到了一个问题。我想对每个键执行值的求和,并且仅当窗口完成时,结果才会发送到输出主题。问题是“输入”主题中的每个事件都会产生一个事件到“输出”主题。我希望仅在窗口完成时将事件发布到输出主题。例如,如果窗口为一分钟,则每分钟每键发送一个事件。示例代码如下所示:Java 如何仅在窗口完成时将窗口聚合结果发送到输出主题?,java,apache-kafka,apache-kafka-streams,suppress,Java,Apache Kafka,Apache Kafka Streams,Suppress,我在进行窗口聚合时遇到了一个问题。我想对每个键执行值的求和,并且仅当窗口完成时,结果才会发送到输出主题。问题是“输入”主题中的每个事件都会产生一个事件到“输出”主题。我希望仅在窗口完成时将事件发布到输出主题。例如,如果窗口为一分钟,则每分钟每键发送一个事件。示例代码如下所示: .groupByKey() .windowedBy(时间窗的持续时间(2)) .reduce((v1,v2)->String.valueOf(Integer.parseInt(v1)+Integer.parseInt(v2
.groupByKey()
.windowedBy(时间窗的持续时间(2))
.reduce((v1,v2)->String.valueOf(Integer.parseInt(v1)+Integer.parseInt(v2)))
.suppress(supprested.untilwindowcloss(BufferConfig.unbounded()))
.toStream((k,v)->k.key())
。至(“输出主题”);
但我得到了以下例外:
线程“learningtime_应用程序-665cd31a-1957-448b-8cf7-779ab359cfd2-StreamThread-1”org.apache.kafka.streams.errors.Processor状态异常:任务[1_0]未能刷新状态存储KSTREAM-REDUCE-state-store-000000000 3
原因:java.lang.ClassCastException:class org.apache.kafka.streams.kstream.Windowed无法强制转换为class java.lang.String(org.apache.kafka.streams.kstream.Windowed位于加载器“app”的未命名模块中;java.lang.String位于加载器“bootstrap”的java.base模块中)
您遇到了一个已知的错误:
suppress
运算符无法从配置中正确拾取默认序列号,即,它使用密钥序列号,但未将其转换为带窗口的密钥序列号
作为一种解决方法,您需要在reduce()
中通过Materialized显式指定serde。使用(…)
。传入普通键和值serde,reduce
将键serde转换为带窗口的键serde,该键serde也将被传递到suppress()