如何在由案例类实例组成的Spark RDD上正确使用groupBy?

时间:2014-11-10 17:04:26

标签: scala group-by apache-spark implicit rdd

我正在尝试在RDD上进行groupBy,其元素是一个简单的案例类的实例,我得到一个奇怪的错误,我不知道如何解决。以下代码重现了Spark-shell中的问题(Spark 0.9.0,Scala 2.10.3,Java 1.7.0):

case class EmployeeRec( name : String, position : String, salary : Double ) extends Serializable;
   // I suspect extends Serializable is not needed for case classes, but just in case...

val data = sc.parallelize( Vector( EmployeeRec("Ana", "Analist", 200 ), 
       EmployeeRec("Maria", "Manager", 250.0 ),
       EmployeeRec("Paul", "Director", 300.0 ) ) )

val groupFun = ( emp : EmployeeRec ) => emp.position

val dataByPos = data.groupBy( groupFun )

上一个语句产生的错误是:

val dataByPos = data.groupBy( groupFun )
<console>:21: error: type mismatch;
found   : EmployeeRec => String
required: EmployeeRec => ?
       val dataByPos = data.groupBy( groupFun )

所以我试过了:

val dataByPos = data.groupBy[String]( groupFun )

错误现在有点吓人了:

val dataByPos = data.groupBy[String]( groupFun )
<console>:18: error: overloaded method value groupBy with alternatives:
 (f: EmployeeRec => String,p: org.apache.spark.Partitioner)(implicit evidence$8:      scala.reflect.ClassTag[String])org.apache.spark.rdd.RDD[(String, Seq[EmployeeRec])] <and>
 (f: EmployeeRec => String,numPartitions: Int)(implicit evidence$7: scala.reflect.ClassTag[String])org.apache.spark.rdd.RDD[(String, Seq[EmployeeRec])] <and>
 (f: EmployeeRec => String)(implicit evidence$6: scala.reflect.ClassTag[String])org.apache.spark.rdd.RDD[(String, Seq[EmployeeRec])]
 cannot be applied to (EmployeeRec => String)
     val dataByPos = data.groupBy[String]( groupFun )

我试图通过添加额外的参数numPartions = 10(当然我的真实数据集远比3条记录大得多)来更加具体地说明我要应用的重载方法groupBy的版本

 val dataByPos = data.groupBy[String]( groupFun, 10 )

我得到与以前完全相同的错误。

有什么想法吗?我怀疑这个问题可能与隐含的证据论证有关......不幸的是,这是scala的一个我不太了解的领域。

注1:使用元组而不是案例类EmployeeRec的此代码的模拟,没有任何问题。但是,我希望能够使用case类而不是元组来获得更好,更易维护的代码,这些代码并不需要我按位置而不是按名称来记住或处理字段(实际上我有超过3个字段每位员工。)

注2:似乎观察到的这个问题(当使用案例类EmployeeRec时)可能会在Spark 1 +中修复,因为上面代码的任何版本都是由eclipse正确编译的使用spark-core_2.10-1.0.0-cdh5.1.0.jar时的scala插件。 但是,我不确定如何或是否能够在我可以访问的集群中运行该版本的Spark,我希望能够更好地理解该问题,以便为Spark 0.9提供解决方案。 0

0 个答案:

没有答案