簡體   English   中英

將 Kafka Stream 字數示例轉換為輸出 JSON 對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM