簡體   English   中英

如何將*窗口化的* KTable實現為Kafka主題

[英]How to materialize a *windowed* KTable into a Kafka topic

我正在編寫一個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);

我不想要所有具有相同串聯值的Windows,我只想擴展字符串串聯。

因為您指定了重疊的窗口,所以一條記錄可以包含在多個窗口實例中。 也許您想指定不重疊的窗口,即, size == advance窗口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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