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 如何计算在特定时间段内使用Kafka Streams生成事件的用户数?_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Apache kafka 如何计算在特定时间段内使用Kafka Streams生成事件的用户数?

Apache kafka 如何计算在特定时间段内使用Kafka Streams生成事件的用户数?,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我有流媒体事件,其中有用户id。我想计算在一定时间内有多少不同的用户生成一个事件。然而,我是卡夫卡的初学者,我无法解决这个问题 1分钟内的示例事件 {"event_name": "viewProduct", "user_id": "12"} {"event_name": "viewProductDetails", "user_id": "23&qu

我有流媒体事件,其中有用户id。我想计算在一定时间内有多少不同的用户生成一个事件。然而,我是卡夫卡的初学者,我无法解决这个问题

1分钟内的示例事件

{"event_name": "viewProduct", "user_id": "12"}
{"event_name": "viewProductDetails", "user_id": "23"}
{"event_name": "viewProductComments", "user_id": "12"}
{"event_name": "viewProduct", "user_id": "23"}
{"event_name": "viewProductComments", "user_id": "32"}
根据上述事件,我的代码应该会生成3个活动用户

我的方法如下,但是此解决方案无法消除来自同一用户的多个事件并多次计算同一用户

builder.stream("orders") // read from orders toic
                .mapValues(v -> { // get user_id via json parser
                    JsonNode jsonNode = null;
                    try {
                        jsonNode = objectMapper.readTree((String) v);
                        return jsonNode.get("user_id").asText();
                    } catch (JsonProcessingException e) {
                        e.printStackTrace();
                    }
                        return "";
                    })
                .selectKey((k, v) -> "1") // put same key to every user_id
                .groupByKey()
                .windowedBy(TimeWindows.of(Duration.ofSeconds(1))) // use time windows
                .count() // count values

我可能错过了什么,你为什么不这样做:

.selectKey((k, v) -> v)

这将按值对记录进行分组,您以前使用
user\u id

填充了该值。为什么要在所有记录上设置相同的键(“1”)?我希望将所有数据分组到相同的键下,并轻松计数。但是,我知道我的方法不好,也没有解决问题。顺便说一句,如果使用JSONSerde作为值反序列化器,就不需要ObjectMapper