打印活动用户从窗口化的kafka流计数到控制台

时间:2018-02-05 18:49:04

标签: apache-kafka kafka-consumer-api kafka-producer-api apache-kafka-streams apache-kafka-connect

我正在尝试聚合流以获取窗口流中user_id的计数。 Stream没有密钥,因此需要从值中获取user_id并聚合并将该窗口中活动用户的数量打印到console / api。 这是代码:

        final KStream<String, avroschema> feeds = builder.stream("input_topic");
final KTable<String, Long> aggregated = feeds
            // map the user id as key
            .map((key, value) -> new KeyValue<>(value.getUserId().toString(), value))
            .groupByKey()
            .count("state_store");
aggregated.print();

我得到的输出是:

[KSTREAM-AGGREGATE-0000000002]: 123 , (1<-null)
[KSTREAM-AGGREGATE-0000000002]: 456 , (1<-null)
[KSTREAM-AGGREGATE-0000000002]: 789 , (1<-null)

如何只打印输出中的计数,如下所示?

 user_count 3

我试着把计数如下:

   KTable<Windowed<String>, Long> countUsers = feeds
            // map the user name as key, because the subsequent counting is performed based on the key
            .map((key, value) -> new KeyValue<>(value.getUserId().toString(), value))
            // count users, using one-minute tumbling windows
            .countByKey(TimeWindows.of("UserCountWindow", 60 * 1000L))

但是它显示如下错误。那有什么问题?

Cannot resolve method 'countByKey(org.apache.kafka.streams.kstream.TimeWindows)'

1 个答案:

答案 0 :(得分:0)

我将用户ID设置为关键字,您可以计算每个用户出现的频率。此计数显然是1

如果要计算所有用户的数量,则需要为要计算的所有记录设置一个“虚拟密钥”。

对于编译错误:它只是错误的代码。阅读文档:https://kafka.apache.org/10/documentation/streams/developer-guide/dsl-api.html#id12

不确定您使用的是哪个版本,但.countByKey(TimeWindows.of("UserCountWindow", 60 * 1000L))是在0.11版本中更改的旧API。