[英]Convert Kafka Stream word-count example to output JSON Objects
我正在完成字數統計示例,目前有:
stream.flatMapValues(value -> Arrays.asList(WORD_PATTERN.split(value.getMessage().toLowerCase())))
.groupBy((key, value) -> value).count(Named.as("word_counts")).toStream()
.to(KafkaTopicConfig.xxx3_REPLY_TOPIC);
我從文檔中了解到,這將生成一個KTable<String, Long>
並且回復主題中的內容將是:
the 3
cat 4
etc.
甚至不確定這是否是好的做法(如果不是,請告訴我哈哈)...但我正在嘗試將其變成更“可用”的 json 格式:
[
{
"word": "the",
"count": "3"
},
{
"word": "cat",
"count": "4"
}
]
這是可行的嗎? 我得到流永遠不會結束,所以它會繼續以這種格式發送 jsons...
我已經定義了一個類 WordCountPairDto 來保存 String, Long 對,我想我正在嘗試將流序列化為ArrayList<WordCountPairDto>
並讓 Json serde 將其序列化為 Json。
任何指針將不勝感激!
我假設您正在使用 Spring Kafka,因為您使用 Spring 標記了問題。 如果您繼承 JsonSerializer 並在 value.serializer 的屬性中配置它,Spring Kafka 可以為您處理任何 pojo 類類型的序列化/反序列化。
然后您可以使用 KafkaTemplate 來生成您的消息類型:
@Autowired
private KafkaTemplate<String, YourPojo> kafkaTemplate;
並生產:
this.kafkaTemplate.send("your.topic", yourMessage);
使用類似,擴展 JsonDeserializer 並在 value.deserializer 的屬性中配置它,然后使用:
@KafkaListener(topic="yourTopic")
public void consume(YourPojo yourPojo){ ... }
為您處理用於發送消息的 YouPojo 實例的序列化,以及將消息反序列化回 YourPojo 的實例。
您的輸出不會是 JSON 數組。 這將是兩個帶有任意鍵的消息。
你可以像這樣得到輸出
stream.flatMapValues(value -> Arrays.asList(WORD_PATTERN.split(value.getMessage().toLowerCase())))
.groupBy((key, value) -> value).count(Named.as("word_counts")).toStream()
.map(this::createJSONMessage)
.to(KafkaTopicConfig.xxx3_REPLY_TOPIC);
您定義public KeyValueMapper<String, String, KeyValue<String, String>> createJSONMessage(String key, String value)
方法以返回您的 JSON 對象字符串作為值
您還可以使用Produced.with
來定義不同的 serdes。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.