Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka kstreams在两个字段上分组以获取计数_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

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

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

我们可以按两个字段(一个是key,另一个是value)分组,并获得kstreams中的计数吗

我想为每个pid(键)获取不同的用户ID(值)计数。groupByKey不会给出不同的用户ID。 我尝试使用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());
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