[英]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(正确地)执行此操作,您可以
aggregate
DSL 函数创建一个新主题,用{"min": +Inf, "max": -Inf}
,然后在新记录上检查旧记录与新记录,如果有新的最小值和/或最大值,请设置他们并返回新记录。 然后,您仍然需要一个外部消费者来获取最近的最小/最大事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.