繁体   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