我正在尝试聚合流以获取窗口流中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)'
答案 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。