Apache kafka kstreams在两个字段上分组以获取计数
我们可以按两个字段(一个是key,另一个是value)分组,并获得kstreams中的计数吗 我想为每个pid(键)获取不同的用户ID(值)计数。groupByKey不会给出不同的用户ID。 我尝试使用groupBy而不是groupByKey,但发现语法错误。有人能帮忙吗Apache kafka kstreams在两个字段上分组以获取计数,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我们可以按两个字段(一个是key,另一个是value)分组,并获得kstreams中的计数吗 我想为每个pid(键)获取不同的用户ID(值)计数。groupByKey不会给出不同的用户ID。 我尝试使用groupBy而不是groupByKey,但发现语法错误。有人能帮忙吗 KStream<Integer, Integer> stream = events.map((key, value) -> new KeyValue<Integer, Integer>(va
KStream<Integer, Integer> stream = events.map((key, value) -> new KeyValue<Integer, Integer>(value.getpid(), value.getUserId()));
KGroupedStream<Integer, Integer> groupedStream = stream.groupByKey(Grouped.with(Serdes.Integer(), Serdes.Integer());
KStream stream=events.map((键,值)->新的键值(value.getpid(),value.getUserId());
KGroupedStream groupedStream=stream.groupByKey(Grouped.with(Serdes.Integer(),Serdes.Integer());
由于每个pid(键)需要不同的用户(值)计数,因此需要首先使用groupByKey
,它将所有用户
分组为相同的pid
。然后需要聚合形成用户
的集合
(以获得唯一用户)。之后,只需获取集的大小
,即可获得每个pid的不同用户数
KStream<Integer, Integer> stream = events.map((key, value) -> new KeyValue<Integer, Integer>(value.getpid(), value.getUserId()));
KStream<Integer, Integer> output = stream.groupByKey().
aggregate((Initializer<Set<Integer>>) HashSet::new,
(k, v, current) -> {current.add(v); return current;}).mapValues(Set::size).toStream();
KStream stream=events.map((键,值)->新的键值(value.getpid(),value.getUserId());
KStream output=stream.groupByKey()。
聚合((初始值设定项)哈希集::新建,
(k,v,current)->{current.add(v);return current;}).mapValues(Set::size).toStream();
如果要按用户id和pid计数,可以将两者作为Pojo放入密钥中:
KStream流=
selectKey((key,value)->newuserpid(value.getpid(),value.getUserId());
KGroupedStream groupedStream=
stream.groupByKey(Grouped.with(new UserPidSerde(),Serdes.Integer());
您需要创建相应的POJO类
UserPid
和serde类UserPidSerde扩展serde
请指定您得到的错误。我尝试在上述kgroupedstream中将groupbykey更改为groupby,错误是kstream无法应用于(org.apache.kafka.streams.kstream.Grouped)
。什么是按两个字段分组的正确方法呢?因为groupby
没有重载方法来接受Grouped
谢谢Matthias,我在上看到了一些serde示例,我必须实现自定义serde才能使用UserPidSerde?是的。您需要为UserPid
类创建自定义serde。创建自定义serde之后UserPidSerde
我看到错误“无法解析此行`kgGroupedStream groupedStream=stream.groupByKey(Grouped.with(new UserPidSerde(),Serdes.Integer())”的方法'groupByKey(org.apache.kafka.streams.kstream.Grouped)';我的最终结果应该是pid,count(不同的用户ID)。如果我使用UserPid POJO,如何实现这一点?我想,KGroupedStream groupedStream
应该是KGroupedStreamgroupedStream
。