Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅在窗口完成时将窗口聚合结果发送到输出主题?_Java_Apache Kafka_Apache Kafka Streams_Suppress - Fatal编程技术网

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()