使用Hazelcast-jet进行最大聚合

时间:2019-03-19 12:18:35

标签: hazelcast-jet

我想对整个数据集做一个简单的最大值。我从以下位置的Kafka示例开始:https://github.com/hazelcast/hazelcast-jet-code-samples/blob/0.7-maintenance/kafka/src/main/java/avro/KafkaAvroSource.java

我刚刚将管道更改为:

p.drawFrom(KafkaSources.<Integer, User>kafka(brokerProperties(), TOPIC))
    .map(Map.Entry::getValue)
    .rollingAggregate(minBy(comparingInt(user -> (Integer) user.get(2))))
    .map(user -> (Integer) user.get(2))
    .drainTo(Sinks.list("result"));

然后转到:

IListJet<Integer> res = jet.getList("result");
SECONDS.sleep(10);
System.out.println(res.get(0));
SECONDS.sleep(15);
System.out.println(res.get(0));
cancel(job);

以获得该主题中年龄最大的人。但是,它不会返回20,并且似乎在不同的运行中返回不同的值。知道为什么吗?

1 个答案:

答案 0 :(得分:2)

您似乎正在使用rollingAggregate,它在每次收到一些输入时都会生成一个新的输出项目,但是您检查的只是它发出的第一个项目。您必须改为找到它发出的 latest 项目。一种实现方法是将结果推入IMap接收器,每次使用相同的键:

p.drawFrom(KafkaSources.<Integer, User>kafka(brokerProperties(), TOPIC))
 .withoutTimestamps()
 .map(Map.Entry::getValue)
 .rollingAggregate(minBy(comparingInt(user -> (Integer) user.get(2))))
 .map(user -> entry("user", (Integer) user.get(2)))
 .drainTo(Sinks.map("result"));

您可以使用

获取最新结果
IMap<String, Integer> result = jet.getMap("result");
System.out.println(result.get("user");