kstreams在两个字段上分组以获取计数

时间:2019-02-08 23:53:59

标签: apache-kafka apache-kafka-streams

我们可以将两个字段分组(一个是键,另一个是值),并以kstreams为单位进行计数。

我想获取每个pid(key)的userid(value)的不同计数。groupByKey不会给出不同的userid。 我尝试使用groupBy而不是groupByKey,但是看到语法错误。有人可以帮忙吗?

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

2 个答案:

答案 0 :(得分:0)

如果要按用户ID和pid进行计数,可以将两者都作为Pojo放入键中:

KStream<UserPid, Integer> stream =
    events.selectKey((key, value) -> new UserPid(value.getpid(), value.getUserId()));
KGroupedStream<Integer, Integer> groupedStream =
    stream.groupByKey(Grouped.with(new UserPidSerde(), Serdes.Integer());

您需要创建相应的POJO类UserPid和Serde类UserPidSerde extends Serde<UserPid>

答案 1 :(得分:-1)

由于每个pid(键)都需要不同的用户(值)计数,因此需要首先使用groupByKey,它将所有users与相同的pid分组。然后,您需要进行汇总以形成set的{​​{1}}(以获得唯一用户)。之后,只需获取user的大小,即可获得每个pid的独立用户数。

set