簡體   English   中英

在 KafkaStream (KStream) 對象中查找最小/最大值

[英]Finding min/max values in a KafkaStream (KStream) object

對於每個主題和密鑰,我都有一個 Kafka Stream 應用程序和 Avro 模式。 關鍵主題模式對所有人都是相同的。

現在,有一個 KafkaStream (KStream) 對象,其中已知鍵對象作為鍵和一個值對象(派生自 AvroSchema)擴展了org.apache.avro.specific.SpecificRecordBase但它可能是我的任何 avro 模式主題內容。

KStream<CustomKey, ? extends SpecificRecordBase> myStream =...

我想要實現的是在此流上運行最小和最大函數。 問題是我不知道什么是? 對象,並且由於有 30 多個(並且將來會增加)主題,我不想做一個切換案例。 所以我有以下內容:

public KStream<CustomKey, ? extends SpecificRecordBase> max(
    final KStream<CustomKey, ? extends SpecificRecordBase> myStream,
    final String attributeName) {

    SpecificRecordBase maxValue = ...;
    myStream.foreach((key, value) -> {
      value.get(attributeName) // I want to find the max value for this attribute, 
                               // but at this point we don't know it's type and
                               // and we can't assign maxValue = value, because this is a lambda 
                               // function.
    });

    // find and return the max value
  }

我的問題是,如何計算attributeName屬性上myStream的最大值?

它可以是我的主題內容的任何 avro 模式

然后你需要extends ClassWithMinMaxFields 否則,您將無法從通用SpecificRecordBase對象中提取它。

此外,您的方法返回一個流。 您不能return最小值/最大值。 如果那是你的目標,你需要一個普通的消費者來瀏覽整個主題,從頭到尾(最終)。

要使用 Streams API(正確地)執行此操作,您可以

  1. 需要為每個值構建一個 KTable,按鍵分組,然后根據需要對最小值/最大值進行表掃描。
  2. 使用aggregate DSL 函數創建一個新主題,用{"min": +Inf, "max": -Inf} ,然后在新記錄上檢查舊記錄與新記錄,如果有新的最小值和/或最大值,請設置他們並返回新記錄。 然后,您仍然需要一個外部消費者來獲取最近的最小/最大事件。
  3. 如果你有一致的 Avro 類型,你可以使用ksqlDB 函數

暫無
暫無

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

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