在 Scala 中将 RDD 映射到 PairRDD

map RDD to PairRDD in Scala

我正在尝试将 RDD 映射到 Scala 中的 pairRDD,以便稍后可以使用 reduceByKey。这是我所做的:

userRecords 属于 org.apache.spark.rdd.RDD[UserElement]

我尝试从 userRecords 创建一个 pairRDD,如下所示:

val userPairs: PairRDDFunctions[String, UserElement] = userRecords.map { t =>
  val nameKey: String = t.getName()
  (nameKey, t)
}

但是,我得到了错误:

类型不匹配;发现:org.apache.spark.rdd.RDD[(字符串,com.mypackage.UserElement)] 要求:org.apache.spark.rdd.PairRDDFunctions[字符串,com.mypackage.UserElement]

我在这里错过了什么?非常感谢!

您不需要这样做,因为它是通过 implicits(明确地 rddToPairRDDFunctions)完成的。任何 Tuple2[K,V] 类型的 RDD 都可以自动用作 PairRDDFunctions。如果你真的想要,你可以明确地做 implicit 所做的并将 RDD 包装在 PairRDDFunction:

val pair = new PairRDDFunctions(rdd)

我认为您只是缺少 org.apache.spark.SparkContext._ 的导入。这会在范围内带来所有正确的隐式转换以创建 PairRDD。

下面的示例应该可以工作(假设您已经在 sc 下初始化了一个 SparkContext):

import org.apache.spark.SparkContext._

val f = sc.parallelize(Array(1,2,3,4,5))
val g: PairRDDFunctions[String, Int] = f.map( x => (x.toString, x))

也可以使用keyBy方法,需要在函数中提供key,

在你的例子中,你可以简单地给出 userRecords.keyBy(t => t.getName())