在Scala中聚合KStream

时间:2018-10-15 13:17:14

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

如果我有以下记录

{"A",7}
{"B",10}
{"C",10}

那么聚合应该是

{"sum_ABC",27}

然后将A更改为10 即添加了新消息

{"A",10}

现在应该计算为

{"sum_ABC",30}


val record: KTable[String, JsonNode] = builder.table("logs",m_consumed)
val aggVal: KTable[String, Double] = record.toStream().groupByKey()
        .reduce(new Reducer[Double]() {
        def apply(val1: Double, val2: Double): Double =
          {
            println(val1)
            val1 + val2
          }
      })

这不起作用 它不断添加值 如果重新启动,则直接添加0 +新值。 到目前为止,我了解到我需要使用聚合而不是减少。 请指导如何做。有链接或教程吗?

1 个答案:

答案 0 :(得分:0)

聚合始终基于键。因此,如果您要汇总具有不同键的邮件(在您的示例A,B,C中),则需要为所有邮件设置新的键,以将它们映射到单个键。

此外,要获取更新语义,您需要在KTable上应用聚合。在您的示例中,要将KTable转换为KStream(通过toStream()),从而将语义从“更新”更改为“事实”。

您应该使用:

KTable record = ...
KTable result = record.groupBy(/* map records that you want to aggregate to the same key*/)
                      .reduce(...).