在尝试使用groupByKey
或PairRDD或MappedRDD的任何功能时,我遇到了一个令人失望的问题。我得到的是,我总是只有一个RDD
,我不知道如何转换它(我确实很确定转换应该由Scala自动检测)。我的代码如下:
val broadcastedDistanceMeasure = sc.broadcast(dbScanSettings.distanceMeasure)
val distances = input.cartesian(input)
.filter(t => t._1!=t._2)
.map( {
case(p1, p2) => (p1) -> broadcastedDistanceMeasure.value.distance(p1,p2)
})
其中input
是RDD
。根据Eclise和sbt run
生成的结果类型实际上是RDD
。所以我无法执行groupByKey
操作。如果我在spark shell上尝试几乎相同的代码,而是获得MappedRDD
。
这是我的build.sbt
文件:
scalaVersion := "2.10.4"
libraryDependencies += "org.apache.spark" % "spark-core_2.10" % "1.1.0"
有人能帮助我吗?
感谢。
问候。
马
答案 0 :(得分:3)
我认为在IDE中,您永远不会看到任何RDD的MappedRDD类型,因为它是作为Spark Scala API中的隐式转换提供的。如果您在source of SparkContext
查找示例,您将看到从公共RDD到专用RDD更丰富接口的隐式转换为PairRDDFunctions
,并且从这个专用接口内部,您可以使用函数{{1由于隐式转换,它们可用。因此,简而言之,我认为您只需要导入groupByKey
即可实现您的目标。
在这种特殊情况下,我认为具体的转换是
org.apache.spark.SparkContext._
将RDD封装成PairRDDFunctions,后者又包含implicit def rddToPairRDDFunctions[K: ClassTag, V: ClassTag](rdd: RDD[(K, V)]) =
new PairRDDFunctions(rdd)
操作。
希望它有所帮助。