KStream<Integer, Integer> stream;
KGroupedStream<Integer, Integer> grouped = stream.groupByKey();
KTable<Integer, Integer> aggregated = grouped.aggregate(
() -> 0,
(k, i, agg) -> {
if (agg == null)
agg = 0;
Integer sum = agg + i;
return sum > 100 ? null : sum;
});
我的信息流中的消息是:
第二条消息到达时,聚合器将返回null。 KTable aggregated
会收到(1,null)并删除key = 1的状态吗?
消息#3到达时agg
为空,还是再次调用初始化程序并将agg
设置为0?
如果我使用reduce而不是aggregation,如果Reducer返回null,那么下一条消息将通过Reducer还是像组中的第一条消息一样“按原样”使用?
谢谢, 大卫
答案 0 :(得分:1)
第二条消息到达时,聚合器将返回null。聚合的KTable是否接收(1,null)并删除key = 1的状态?
是的
消息3到达时是agg null还是再次调用初始化程序并将agg设置为0?
再次调用初始化程序。
如果我使用reduce而不是aggregation,如果Reducer返回null,那么下一条消息将通过Reducer还是像组中的第一条消息一样“按原样”使用?
Reduce的工作方式类似于聚合。因此,如果您返回null
,则将以下消息当作第一条消息处理。
元注释:为什么不只是运行代码并尝试一下呢?