卡夫卡聚合不正确

时间:2018-09-24 09:43:49

标签: apache-kafka apache-kafka-streams kafka-streams-scala

嗨,我有一个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 ) 哪个是对的。不确定!

0 个答案:

没有答案