如何在scala中将自定义函数传递给RDD的reduceByKey

时间:2017-04-08 09:42:29

标签: scala apache-spark

我的要求是在RDD中找到每个组的最大值。

我尝试了下面的内容;​​

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(_,_) )

如何做到这一点?

1 个答案:

答案 0 :(得分: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))

而不是&#34;如何做到这一点?&#34;你应该已经解释了你的预期结果。我认为你犯了一些错误:

  • 使用filter代替reduceByKey(为什么??)
  • reduceByKey仅适用于PairRDD s,因此您需要使用元组而不是Array[Any](无论如何这都是错误的类型)
  • 您不需要为math.max编写自己的包装函数,只需按原样使用