2015-03-02 34 views
5

Tôi muốn sử dụng hàm lambda để tính trung bình bằng khóa của một (JavaPairRDD<Integer, Double> pairs). Vì lý do đó, tôi đã phát triển mã sau:Spark Combinebykey Biểu thức lambda JAVA

java.util.function.Function<Double, Tuple2<Double, Integer>> createAcc = x -> new Tuple2<Double, Integer>(x, 1); 

BiFunction<Tuple2<Double, Integer>, Double, Tuple2<Double, Integer>> addAndCount = (Tuple2<Double, Integer> x, Double y) -> { return new Tuple2(x._1()+y, x._2()+1); }; 

BiFunction<Tuple2<Double, Integer>, Tuple2<Double, Integer>, Tuple2<Double, Integer>> combine = (Tuple2<Double, Integer> x, Tuple2<Double, Integer> y) -> { return new Tuple2(x._1()+y._1(), x._2()+y._2()); }; 

JavaPairRDD<Integer, Tuple2<Double, Integer>> avgCounts = pairs.combineByKey(createAcc, addAndCount, combine); 

Tuy nhiên, nhật thực diplays này lỗi:

The method combineByKey(Function<Double,C>, Function2<C,Double,C>, Function2<C,C,C>) in the type JavaPairRDD<Integer,Double> is not applicable for the arguments (Function<Double,Tuple2<Double,Integer>>, 
BiFunction<Tuple2<Double,Integer>,Double,Tuple2<Double,Integer>>, BiFunction<Tuple2<Double,Integer>,Tuple2<Double,Integer>,Tuple2<Double,Integer>>) 
+1

Hãy thử thay thế java.util.function.BiFunction bằng org.apache.spark.api.java.function.Function2 –

+0

Cảm ơn bạn! điều này đã giải quyết được vấn đề. – Wassim

Trả lời

5

Phương pháp combineByKey hy vọng org.apache.spark.api.java.function.Function2 thay vì java.util.function.BiFunction. Vì vậy, hoặc bạn viết:

java.util.function.Function<Double, Tuple2<Double, Integer>> createAcc = 
    x -> new Tuple2<Double, Integer>(x, 1); 

Function2<Tuple2<Double, Integer>, Double, Tuple2<Double, Integer>> addAndCount = 
    (Tuple2<Double, Integer> x, Double y) -> { return new Tuple2(x._1()+y, x._2()+1); }; 

Function2<Tuple2<Double, Integer>, Tuple2<Double, Integer>, Tuple2<Double, Integer>> combine = 
    (Tuple2<Double, Integer> x, Tuple2<Double, Integer> y) -> { return new Tuple2(x._1()+y._1(), x._2()+y._2()); }; 

JavaPairRDD<Integer, Tuple2<Double, Integer>> avgCounts = 
    pairs.combineByKey(createAcc, addAndCount, combine); 
+0

Vui lòng cập nhật phiên bản đầu tiên, nó phải là org.apache.spark.api.java.function.Function – Wassim

+1

yes, java.util.function là sai. cần cập nhật –