Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka Kafka流-KTable上最小/最大值的高效计算_Apache Kafka_Apache Kafka Streams - Fatal编程技术网

Apache kafka Kafka流-KTable上最小/最大值的高效计算

Apache kafka Kafka流-KTable上最小/最大值的高效计算,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,在Kafka Streams应用程序中,我们有一个KTable(不是KStream),我们希望在其中计算一些统计信息,例如满足特定属性的所有“行”/项的最小值或最大值。因此,我们通过将分组属性设置为键,将KTable转换为KGroupedTable。使用这个分组表,现在可以简单地计算count或sum之类的内容。我们只需使用带有特定适当加法器和减法器函数的聚合方法。(+/-1表示计数,+/-值表示总和) 然而,对于像min/max这样的聚合,没有这样简单的减法函数。实现最小/最大聚合的一个解决方

在Kafka Streams应用程序中,我们有一个KTable(不是KStream),我们希望在其中计算一些统计信息,例如满足特定属性的所有“行”/项的最小值或最大值。因此,我们通过将分组属性设置为键,将KTable转换为KGroupedTable。使用这个分组表,现在可以简单地计算count或sum之类的内容。我们只需使用带有特定适当加法器和减法器函数的
聚合
方法。(+/-1表示计数,+/-值表示总和)

然而,对于像min/max这样的聚合,没有这样简单的减法函数。实现最小/最大聚合的一个解决方案是将值聚合到类似于映射的东西,其中加法器函数向映射中添加,而减法从映射中删除。与连续步骤相比,我们可以通过简单地迭代条目,将该映射映射到最小/最大值

//不带类型和serde的示例
KTable sums=myKTable.groupBy((k,v)->KeyValue.pair(v.getProperty(),v)
.aggregate(()->0,(k,v,a)->a+v.getValue(),(k,v,a)->a-v.getValue();
KTable mins=myKTable.groupBy((k,v)->KeyValue.pair(v.getProperty(),v)
.aggregate(()->Map.of(),(k,v,a)->a.put(v.getId(),v.getValue()),(k,v,a)->a.remove(v.getId())
.mapValues((k,v)->StatsHelper.min(v));

然而,这并不是很顺利,因为我们必须一直序列化整个地图及其所有条目。有没有更好的方法来实现这一点,即获取所有相关的“行”直接通过框架?或者这根本不可行?

使用
Map
是唯一的方法——正如您所提到的,max/min是不可减法的,因此需要存储所有原始值。这只是当前值吗(v2.1)实现还是Kafka Streams体系结构要求的有意识的决策?因为对给定密钥执行聚合的部署实例必须已收到每个相关消息(“要聚合的行”)使用之前的这个键,我希望可以在这个实例中存储这些值。例如,在相应的键值存储中;类似于聚合结果本身。或者我遗漏了什么?@MatthiasJ.SaxIt与体系结构无关。Kafka Streams可以支持这种开箱即用的方法;只是没有在这个wa中实现这里的解决方案不是:ktable.map(…).toStream().groupByKey().aggregate(…)?