在键值对的PCollection中查找具有最大值的键

时间:2018-07-10 21:25:06

标签: apache-beam

我有PCollection个项中有KV<String,Integer>个,我想找到值最大的那对。

例如,如果键值对是 {foo:3,bar:2,baz:7} 那么结果将是一对baz:7

Max class中的任何方法似乎都不能完全满足我的要求:

  • Max.integersPerKey给出PCollection个与输入中的每个键关联的最高值的键值对;我只想要一个具有全球最高价值的商品。

  • Max.integersGlobally需要PCollection的整数;它不需要键值对。从KV对映射到仅值然后使用此值将得到最高值,但我也想保留与该值关联的键。

1 个答案:

答案 0 :(得分:2)

当您使用Max.of(comparator)并实现一个比较器来比较KV<String,Integer>的值时,它应该可以工作。

这样的比较器可以如下所示:

 public static class KVComparator implements Comparator<KV<String,Integer>>, Serializable {
        @Override
        public int compare(KV<String, Integer> o1, KV<String, Integer> o2) {
         return   o1.getValue().compareTo(o2.getValue());
        }
    }

当您拥有PCollection<KV<String,Integer>> p时,它看起来像这样:

 p.apply(Combine.globally(Max.of(new KVComparator())));