Kafka Streams-在KTable上有效地计算最小/最大

时间:2018-12-10 12:48:01

标签: apache-kafka apache-kafka-streams

在Kafka Streams应用程序中,我们有一个 KTable (不是KStream),我们要在其中计算一些统计信息,例如满足特定属性的所有“行” /条目的最小值或最大值。因此,我们通过将分组属性设置为键将KTable转换为KGroupedTable。使用此分组表,现在可以很容易地计算出计数或总和之类的值。我们只需要将aggregate方法与特定的适当加法器和减法器函数一起使用即可。 (+/- 1表示计数,+ /-表示总计)。

但是,对于最小/最大等聚合,没有如此简单的减法器功能。一种实现最小/最大聚合的解决方案是将值聚合到地图上,其中加法器功能添加到地图上,减法是从地图上删除 。比起连续的步骤,我们可以map通过简单地遍历条目来将此映射映射到最小值/最大值。

// Example without types and serdes
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));

但是,这感觉并不十分流畅,因为我们将不得不在整个时间内将整个地图及其所有条目序列化。是否有更好的方法来实现这一目标,即直接通过框架获取所有相关的“行”?还是这根本不可行?

0 个答案:

没有答案