2015-04-23 76 views
1

我改变了这一行:值mkString不是org.apache.spark.rdd.RDD值[INT]

val ratedNum = rows.sortBy(- _._2).map{case (user , ratednum) => ratednum}.take(20).mkString("::") 

到:

val ratedNum = rows.sortBy(- _._2).map{case (user , ratednum) => ratednum}.mkString("::") 

但是Eclipse是给我一个错误提示:value mkString is not a value of org.apache.spark.rdd.RDD[Int]

这个错误是什么意思?

+1

也...虽然事情像'地图{情况下(用户,ratednum)=> ratednum}。取(20)'工作.. 。将它作为'map({case(user,ratednum)=> ratednum})可读性更好一些。take(20)'或'map {case(user,ratednum)=> ratednum} take 20' –

回答

4
val ratedNum = rows.sortBy(- _._2).map{case (user , ratednum) => ratednum} 

这将返回org.apache.spark.rdd.RDD[Int]这是不GenTraversableOnce。虽然它定义了很多方法,使其像Scala集合Int,它不是abstract class RDD[T] extends Serializable with Logging)。这有点像集合Int的承诺。你必须在你的mkString之前轮询收集结果。

在执行mkString之前,请致电.collect(),RDD[Int]

val ratedNum = rows.sortBy(- _._2).map{case (user , ratednum) => ratednum}.collect.mkString("::") 

或者,您可以添加的隐式转换:

implicit def toArray[T](rdd: RDD[T]) = rdd.collect()