我有一个带有输入主题input
的kafka Streams应用程序,其中以下记录以json日志形式出现:
JSON日志:
{"CreationTime":"2018-02-12T12:32:31","UserId":"abc@gmail.com","Operation":"upload","Workload":"Drive"}
我正在构建一个来自主题的流:
final StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> source_user_activity = builder.stream("input");
接下来我想分组"UserId"
并找到针对每个用户的计数。
final Serde<String> stringSerde = Serdes.String();
final Serde<Long> longSerde = Serdes.Long();
final StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> source_user_activity = builder.stream("input");
final KTable<String, Long> wordCounts = source_user_activity
.flatMap((key, value) -> {
List<KeyValue<String, String>> result = new LinkedList<>();
JSONObject valueObject = new JSONObject(value);
result.add(KeyValue.pair((valueObject.get("UserId").toString()), valueObject.toString()));
return result;
})
.groupByKey()
.count();
wordCounts.toStream().to("output",Produced.with(stringSerde, longSerde));
wordCounts.print();
接下来,我使用output
从console-consumer
主题消费记录。我没有看到任何文字,它只是这样的一些东西:
然而wordCounts.print()
显示了这一点:
[KSTREAM-AGGREGATE-0000000003]: abc@gmail.com, (1<-null)
我在这里做错了什么?感谢。
How can I convert a Unix timestamp to DateTime and vice versa?
答案 0 :(得分:1)
默认情况下,值的数据编码为long
(您使用LongSerde
表示值)和控制台使用者用户StringDeserializer
,因此无法正确反序列化值
您需要通过控制台使用者的命令行参数为值指定LongDeserializer
。