如果KGroupedStream的聚合器返回null,会发生什么情况?

时间:2018-10-07 19:41:30

标签: apache-kafka apache-kafka-streams

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;
    });

我的信息流中的消息是:

  1. (1,50)
  2. (1,75)
  3. (1,50)

第二条消息到达时,聚合器将返回null。 KTable aggregated会收到(1,null)并删除key = 1的状态吗?

消息#3到达时agg为空,还是再次调用初始化程序并将agg设置为0?

如果我使用reduce而不是aggregation,如果Reducer返回null,那么下一条消息将通过Reducer还是像组中的第一条消息一样“按原样”使用?

谢谢, 大卫

1 个答案:

答案 0 :(得分:1)

  

第二条消息到达时,聚合器将返回null。聚合的KTable是否接收(1,null)并删除key = 1的状态?

是的

  

消息3到达时是agg null还是再次调用初始化程序并将agg设置为0?

再次调用初始化程序。

  

如果我使用reduce而不是aggregation,如果Reducer返回null,那么下一条消息将通过Reducer还是像组中的第一条消息一样“按原样”使用?

Reduce的工作方式类似于聚合。因此,如果您返回null,则将以下消息当作第一条消息处理。

元注释:为什么不只是运行代码并尝试一下呢?