2017-04-08 29 views
0

我的要求是找到RDD中每個組的最大值。如何將定製函數傳遞給scala中的RDD的reduceByKey

我試過了下面;

scala> val x = sc.parallelize(Array(Array("A",3), Array("B",5), Array("A",6))) 
x: org.apache.spark.rdd.RDD[Array[Any]] = ParallelCollectionRDD[0] at parallelize at <console>:27 

scala> x.collect 
res0: Array[Array[Any]] = Array(Array(A, 3), Array(B, 5), Array(A, 6))   

scala> x.filter(math.max(_,_)) 
<console>:30: error: wrong number of parameters; expected = 1 
       x.filter(math.max(_,_)) 
          ^

我也嘗試了下面; 選項1:

scala> x.filter((x: Int, y: Int) => { math.max(x,y)}) 
<console>:30: error: type mismatch; 
found : (Int, Int) => Int 
required: Array[Any] => Boolean 
       x.filter((x: Int, y: Int) => { math.max(x,y)}) 

選項2:

scala> val myMaxFunc = (x: Int, y: Int) => { math.max(x,y)} 
myMaxFunc: (Int, Int) => Int = <function2> 

scala> myMaxFunc(56,12) 
res10: Int = 56 

scala> x.filter(myMaxFunc(_,_)) 
<console>:32: error: wrong number of parameters; expected = 1 
       x.filter(myMaxFunc(_,_)) 

如何得到這個權利?

+0

哪裏是reduceByKey在你的代碼?爲何使用過濾器? – stholzm

回答

1

我只能猜測,可能是你想做的事:「怎麼得到這個權利」

val rdd = sc.parallelize(Array(("A", 3), ("B", 5), ("A", 6))) 
val max = rdd.reduceByKey(math.max) 
println(max.collect().toList) // List((B,5), (A,6)) 

代替你應該解釋你的預期結果是什麼。我認爲你犯了一些錯誤:使用filter代替reduceByKey(爲什麼?)

  • reduceByKey只適用於PairRDD S,所以你需要的元組,而不是Array[Any](這是壞的類型反正)
    • 你不需要編寫自己的包裝功能math.max,你可以使用它作爲-是
    相關問題