【问题标题】:Spark: find max key in a JavaPairRDDSpark:在 JavaPairRDD 中查找最大键
【发布时间】:2016-12-09 15:39:32
【问题描述】:

我有一些看起来像 JavaPairRDD<Integer, Iterable<String>> 的 JavaPairRDD,其中 IntegerIterable 字段中包含的单词的出现次数。

我想找到与最大键值关联的 JavaPairRDD。

JavaRDD max 方法的签名如下:

public static T max(java.util.Comparator<T> comp)

但我不知道如何实现它...

【问题讨论】:

  • 我不确定这是否会像您期望的那样工作,但无论哪种方式,您是说您只想要 RDD 中整数的最大值吗?
  • @rurgrag 查看我的回答,有 Comparator 和 max 的完整代码,而不仅仅是您拥有的预处理

标签: java apache-spark rdd comparator keyvaluepair


【解决方案1】:

使用keys()方法获取最大值,然后过滤原始RDD:

Integer maxKeys = originalRDD.keys().max ((x, y) -> x-y);

JavaPairRDD<Integer, Iterable<String>> withMaxKeys = originalRDD.filter (x -> x._1.equals(maxKeys))

或者只是过滤原始 RDD - 确保键是唯一的!

Tuple2<Integer, Iterable<String>> withMaxKeys = originalRDD.max ((x, y) -> x._1 - y._1);

._1 表示元组的第一个元素,在本例中是 RDD 键

您可以编写即(在第二种情况下)而不是 lambda 表达式:

public class JavaPairRDDTests {

    public static class TupleComparator implements Comparator<Tuple2<Integer, Iterable<String>>>, Serializable {
        @Override
        public int compare(Tuple2<Integer, Iterable<String>> x, Tuple2<Integer, Iterable<String>> y) {
            return Integer.compare(x._1(), y._1());
        }
    }

    public static void main (String[] args) {
        JavaPairRDD<Integer, Iterable<String>> originalRDD = /* ... */;

        Tuple2<Integer, Iterable<String>> withMaxKeys = originalRDD.max(new TupleComparator());
    }

}

this问题的帮助下编写

【讨论】:

  • 我收到这个错误:错误:不兼容的类型:Tuple2> 无法转换为 JavaPairRDD> JavaPairRDD> withMaxKeys = originalRDD.max(new Comparator>>() {......});
  • @rugrag 没有编译器写的:/ 等一下,我会检查它
  • @rugrag 答案已更新。我没有改变 withMaxKeys 的类型。请注意,如果您有重复的密钥,那么这种方法将失败 - 然后只使用第一种方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多