我正在编写一个KafkaStreams应用程序,它从一个主题获取字符串值,我想在这里输出最后5分钟某个键的值的串联,每分钟更新为另一个(压缩的)Kafka话题。我有一种感觉,我几乎就在那里,但我还没有成功。 我用简单的方法进行了测试:
grouped_transactions.toStream().foreach((key, value) -> {
System.out.println(key.window().toString()+ key.key() + " "+ value);
});
这给了我类似下面的内容(我已经按源主题键00909过滤以简化调试)我不想要的是 所有不同的Windows具有相同的连接值,我只想要扩展字符串连接。
Window{start=1525437120000, end=1525437420000}00909 "ABC",-554.53
Window{start=1525437360000, end=1525437660000}00909 "ABC",-554.53
Window{start=1525437240000, end=1525437540000}00909 "ABC",-554.53
Window{start=1525437300000, end=1525437600000}00909 "ABC",-554.53
Window{start=1525437180000, end=1525437480000}00909 "ABC",-554.53
Window{start=1525437120000, end=1525437420000}00909 "ABC",-554.53;"ABC",646.03
Window{start=1525437180000, end=1525437480000}00909 "ABC",-554.53;"ABC",646.03
Window{start=1525437240000, end=1525437540000}00909 "ABC",-554.53;"ABC",646.03
Window{start=1525437300000, end=1525437600000}00909 "ABC",-554.53;"ABC",646.03
Window{start=1525437360000, end=1525437660000}00909 "ABC",-554.53;"ABC",646.03
以下是所有代码。谁知道怎么做? 提前谢谢!
Properties props = new Properties();
props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
props.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, 0);
props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());
StreamsBuilder builder = new StreamsBuilder();
long windowSizeMs = TimeUnit.MINUTES.toMillis(5); // 5 * 60 * 1000L
long advanceMs = TimeUnit.MINUTES.toMillis(1); // 1 * 60 * 1000L
TimeWindows window = TimeWindows.of(windowSizeMs).advanceBy(advanceMs);
KTable<Windowed<String>, String> grouped_transactions = source
.filter((k,v)->k.equals("00909"))
.groupByKey()
.windowedBy(window)
.reduce((v1, v2) -> v1 + ";" + v2, Materialized.as("grouped_transactions_5_1"));
// THIS FAILS on runtime with
// java.lang.ClassCastException: org.apache.kafka.streams.kstream.Windowed
// cannot be cast to java.lang.String
grouped_transactions.toStream().to(GROUPEDTRANSACTIONS);
final KafkaStreams streams = new KafkaStreams(builder.build(), props);
答案 0 :(得分:0)
我不想要的是具有相同连接值的所有不同的Windows,我只想要扩展字符串连接。
因为您指定了重叠窗口,所以可以在多个窗口实例中包含单个记录。也许,您想要指定不重叠的窗口,即带有size == advance
的窗口。