我正在尝试使用Kafka Streams编写我的第一个练习应用程序,以计算主题中的单词数。但是,我认为我指的是旧的API,因为在lambda函数的末尾,我想将KTable的输出放在一个主题上,但是我看不到任何这样的方法。
我所引用的代码使用方法to()
,但我认为现在没有这样的方法。我看到了toStream()
,但不知道如何使用它向特定的输出主题发送消息。
有人可以看看,因为这应该很基本。
public static void main(String[] args) {
Properties config = new Properties();
config.put(StreamsConfig.APPLICATION_ID_CONFIG,"streams-starter-project");
config.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
config.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,"earliest");
config.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
config.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG,Serdes.Short().getClass());
StreamsBuilder builder = new StreamsBuilder();
//1- Stream from Kafka
KStream<String, String> wordCountInput = builder.stream("word-count-input");
//2 - map values to lowercase
KTable<String,Long> wordCounts = wordCountInput
.mapValues(textlines -> textlines.toLowerCase())
//or mapValues(String::toLowercase())
//3- flatMapValues split by space
.flatMapValues(lowerCasedTextLine-> Arrays.asList(lowerCasedTextLine.split(" ")))
//4- Select key to apply a key and discard old key
.selectKey((ignoredKey,word)-> word)
//5 - groupBy key before aggregation
.groupByKey()
//6- count occurences finally
.count();
**wordCounts.to**
答案 0 :(得分:0)
您可以使用以下计数方法:
KTable<K, Long> count(Materialized<K, Long, KeyValueStore<Bytes, byte[]>> var1);
所以在您的代码中:
KStream<String, String> wordCountInput = builder.stream("word-count-input");
//2 - map values to lowercase
KTable<String,Long> wordCounts = wordCountInput
.mapValues(textlines -> textlines.toLowerCase())
//or mapValues(String::toLowercase())
//3- flatMapValues split by space
.flatMapValues(lowerCasedTextLine-> Arrays.asList(lowerCasedTextLine.split(" ")))
//4- Select key to apply a key and discard old key
.selectKey((ignoredKey,word)-> word)
//5 - groupBy key before aggregation
.groupByKey()
//6- count occurences finally
.count(Materialized.<String, Long, KeyValueStore<Bytes, byte[]>>as("your-topic-name")
.withKeySerde(Serdes.String())
.withValueSerde(Serdes.Long()));
材料化生成状态存储(默认为RocksDB)并同步到kafka主题“ yournameapp-your-topic-name-changelog”。然后,您可以创建kafka使用者以读取该主题,或创建交互式查询以获取ktable的数据。
答案 1 :(得分:-1)
您可以使用以下代码。
workCounts.toStream().to("word-count-output", Produced.with(Serdes.String(), Serdes.Long()));
KafkaStreams streams = new KafkaStreams(builder.build(), config);
streams.start();