如果我有以下记录
{"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 +新值。 到目前为止,我了解到我需要使用聚合而不是减少。 请指导如何做。有链接或教程吗?
答案 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(...).