如何将KTable输出发布到特定的Kafka主题?

时间:2019-12-25 22:07:40

标签: apache-kafka-streams

我正在尝试使用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**

2 个答案:

答案 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();