嗨,我有一个Kafka聚合,当我从IDE中运行它时,它实际上无法正常工作。我希望它只是对数字求和,但不添加任何东西。但是,它在IDE中的调试模式下起作用。我不确定为什么,因为如果我缺少某些默认的窗口项,那么在IDE(使用IntelliJ的Im)中的调试模式下,如果没有的话,就不应进行聚合。有没有人见过这个?我发布了程序的主要处理过程。输入记录的摘录也在下面。
val result = kstream
.map[String, Array[Byte]]((key1: String, value: Array[Byte]) => {
val lv = GroupByAction
.convertByteArrayToJsonObject(value)
val newKey = GroupByAction
.reKey(lv, groupByColumnList.asScala.toList, List.empty[String])
val valueNew = getColumnValue(lv, aggregateColumnList.asScala.toList)
(newKey, serialise(valueNew))
})
.groupByKey(Serialized.`with`(Serdes.String, Serdes.ByteArray))
.reduce((oldVal: Array[Byte], newVal: Array[Byte]) => newVal)(Materialized.`with`(Serdes.String, Serdes.ByteArray))
.groupBy((k,v) => (k,v))(
Serialized.`with`(Serdes.String, Serdes.ByteArray))
.aggregate[Array[Byte]](serialise(0L) )(
(key: String
,newValue: Array[Byte]
, agg: Array[Byte]) => {
type typeI = String
type typeL = Long
val nVS = deserialise[String](newValue)
val nVSI = nVS.toInt
//val nVS = nV.asInstanceOf[String]
//val nVSI = nVS.toInt
val aVL = deserialise[Long](agg)
//val aVL = aV.asInstanceOf[Long]
val agg1 = nVSI + aVL
println(agg1.toString)
serialise(agg1)
}
,
(key: String
,oldValue: Array[Byte]
, agg: Array[Byte]) =>
oldValue
)(Materialized.`with`(Serdes.String, Serdes.ByteArray))
.mapValues(v => { val s = deserialise[Long](v).toString; println(s); s})
.toStream
.to(outputTopic)
6条输入记录基本上是
{key = 8, value = 0}
{key = 7, value = 1}
{key = 4, value = 2}
{key = 8, value = 0}
{key = 7, value = 1}
{key = 4, value = 2}
在运行模式下运行时,主题中的输出仅为(0,1,2),这是错误的,但是在IDE的调试模式下,当我逐步进行调试时,主题中的输出为(0,2,4 ) 哪个是对的。不确定!