Kafka Streams:通过Json日志中的密钥进行分组

时间:2018-04-10 19:56:15

标签: java apache-kafka apache-kafka-streams confluent-kafka

我有一个带有输入主题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();

接下来,我使用outputconsole-consumer主题消费记录。我没有看到任何文字,它只是这样的一些东西:

然而wordCounts.print()显示了这一点:

[KSTREAM-AGGREGATE-0000000003]: abc@gmail.com, (1<-null)

我在这里做错了什么?感谢。

How can I convert a Unix timestamp to DateTime and vice versa?

1 个答案:

答案 0 :(得分:1)

默认情况下,值的数据编码为long(您使用LongSerde表示值)和控制台使用者用户StringDeserializer,因此无法正确反序列化值

您需要通过控制台使用者的命令行参数为值指定LongDeserializer