【问题标题】:Spark & Scala: can't get MappedRDD to perferm groupByKey from RDDSpark 和 Scala:无法从 RDD 中获取 Mapped RDD 来执行 group By Key
【发布时间】:2015-03-08 01:19:02
【问题描述】:

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

谁能帮帮我?

谢谢。

您好。

马可

【问题讨论】:

  • 也许您没有看到groupByKey 操作只是因为您没有导入org.apache.spark.SparkContext._

标签: scala apache-spark rdd


【解决方案1】:

我认为在 IDE 中,您永远不会看到任何 RDD 的 MappedRDD 类型,因为这是在 Spark Scala API 中作为隐式转换提供的。例如,如果您查看source of SparkContext,您将看到从通用 RDD 到专用 RDD 更丰富接口的隐式转换,如 PairRDDFunctions,并且从这个专用接口内部,您可以使用 groupByKey 提供的函数由于隐式转换。所以,简而言之,我认为你只需要导入org.apache.spark.SparkContext._就可以实现你想要的。

在这种特殊情况下,我认为具体的转换是

implicit def rddToPairRDDFunctions[K: ClassTag, V: ClassTag](rdd: RDD[(K, V)]) =
    new PairRDDFunctions(rdd)

将 RDD 包装到 PairRDDFunctions 中,而 PairRDDFunctions 又包含 groupByKey 操作。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2015-10-31
    • 2016-12-08
    相关资源
    最近更新 更多