火花& Scala:无法从RDD获取MappedRDD到perferm groupByKey

时间:2015-03-07 16:44:01

标签: scala apache-spark rdd

在尝试使用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)
  })

其中inputRDD。根据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"

有人能帮助我吗?

感谢。

问候。

1 个答案:

答案 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) 操作。

希望它有所帮助。