Apache kafka 来自不同卡夫卡主题的事件数的聚合(总和)

Apache kafka 来自不同卡夫卡主题的事件数的聚合(总和),apache-kafka,apache-kafka-streams,spring-cloud-stream,spring-cloud-stream-binder-kafka,Apache Kafka,Apache Kafka Streams,Spring Cloud Stream,Spring Cloud Stream Binder Kafka,我的应用程序有三个主题,它们接收属于用户的一些事件: Event Type A -> Topic A Event Type B -> Topic B Event Type C -> Topic C 这是消息流的一个示例: Message(user 1 - event A - 2020-01-03) Message(user 2 - event A - 2020-01-03) Message(user 1 - event C - 2020-01-20) Message(us

我的应用程序有三个主题,它们接收属于用户的一些事件:

Event Type A -> Topic A
Event Type B -> Topic B
Event Type C -> Topic C
这是消息流的一个示例:

Message(user 1 - event A - 2020-01-03) 
Message(user 2 - event A - 2020-01-03) 
Message(user 1 - event C - 2020-01-20)
Message(user 1 - event B - 2020-01-22)
我希望能够生成每个用户每月事件总数的报告,汇总三个主题中的所有事件,例如:

User 1 - 2020-01 -> 3 total events
User 2 - 2020-01 -> 1 total events

有三个Kstream(每个主题一个),我如何每月执行此加法来汇总三个不同主题的所有事件?您可以显示此操作的代码吗?

因为您只对计数感兴趣,最简单的方法是将用户id保留为键,并为每个
KStream
保留一些虚拟值,合并所有三个流,然后进行窗口计数(请注意,不支持开箱即用的基于日历的窗口;您可以使用31天窗口作为近似值或构建自己的自定义窗口):

//只映射到伪空字符串(注意,'null'不起作用
KStream streamA=builder.stream(“topic-A”).mapValues(v->”);
KStream streamB=builder.stream(“topic-B”).mapValues(v->“”);
KStream streamC=builder.stream(“topic-C”).mapValues(v->“”);
streamA.merge(streamB.merge(streamC.groupByKey().windowBy(…).count();

您可能还对
suppress()感兴趣
operator.

回答得很好Matthias!你能给我一些关于如何从每个月的第一天到最后一天实现基于日历的窗口的提示吗?我在其他场景中遇到过这种需要,但仍然不知道如何实现。这可能会有所帮助:--它为不同的时区实现每日窗口(默认情况下,所有窗口均基于UTC时区)。
// just map to dummy empty string (note, that `null` would not work
KStream<UserId, String> streamA = builder.stream("topic-A").mapValues(v -> "");
KStream<UserId, String> streamB = builder.stream("topic-B").mapValues(v -> "");
KStream<UserId, String> streamC = builder.stream("topic-C").mapValues(v -> "");

streamA.merge(streamB).merge(streamC).groupByKey().windowBy(...).count();