通过操纵其值(Sum)Spark来转换JavaPairRDD

时间:2017-07-22 01:14:59

标签: apache-spark rdd

使用Java处理apache spark。我有一个JavaPairRDD RDD1,我想通过生成RDD1的值之和来创建另一个JavaPairRdd RDD2。但是,当我执行以下代码时,它会在test_3转换中阻塞,而不会出现任何错误消息。我认为这与在另一次转型中执行rdd转换或行动的问题有关。

JavaPairRDD<Key, JavaPairRDD<Integer, Double>> test_2 = test_1.mapToPair(new PairFunction<Tuple2<Key, JavaPairRDD<Integer, Double>>, Key, JavaPairRDD<Integer, Double>>() {
        @Override
        public Tuple2<Key, JavaPairRDD<Integer, Double>> call(Tuple2<Key, JavaPairRDD<Integer, Double>> t) throws Exception {
            return new Tuple2(t._1,t._2.reduceByKey((Double val1, Double val2)
                    -> Math.pow(Math.abs(val1 - val2), 2)));
        }
    });
   JavaPairRDD<Key, JavaPairRDD<Integer, Double>> test_3 = test_2.mapToPair
    (new PairFunction<Tuple2<Key, JavaPairRDD<Integer, Double>>, Key, JavaPairRDD<Integer, Double>>() {
        @Override
        public Tuple2<Key, JavaPairRDD<Integer, Double>> call(Tuple2<Key, JavaPairRDD<Integer, Double>> t)
                throws Exception {
            return new Tuple2(t._1,t._2.values().reduce((Double t1, Double t2) -> t1+t2));
    }});
    JavaPairRDD<Key, Double> test_4= test_3.mapToPair
    (new PairFunction<Tuple2<Key, JavaPairRDD<Integer, Double>>, Key, Double>() {
        @Override
        public Tuple2<Key, Double> call(Tuple2<Key, JavaPairRDD<Integer, Double>> t) throws Exception {
                return new Tuple2(t._1,t._2.values().first());
        }
    });

1 个答案:

答案 0 :(得分:0)

您的问题在test_3之前开始。您不能将该值作为RDD。 JavaPairRDD<Key, JavaPairRDD<Integer, Double>>您可以尝试返回tuple2(Integer,Double)列表。这样的事情:JavaPairRDD<Key, List<Tuple2<Integer, Double>>>