值连接不是org.apache.spark.rdd.RDD [(Long,T)]的成员

Ben*_*min 1 scala apache-spark

这个函数似乎对我的IDE有效:

def zip[T, U](rdd1:RDD[T], rdd2:RDD[U]) : RDD[(T,U)] = {
    rdd1
      .zipWithIndex
      .map(_.swap)
      .join(
        rdd2
          .zipWithIndex
          .map(_.swap))
      .values
}
Run Code Online (Sandbox Code Playgroud)

但是当我编译时,我得到:

value join不是org.apache.spark.rdd.RDD [(Long,T)]的成员可能的原因:在`value join'之前可能缺少分号?.加入(

我在Spark 1.6中,我已经尝试导入org.apache.spark.rdd.RDD._ 并且函数内部的代码在函数定义之外的两个RDD上直接使用时效果很好.

任何的想法 ?

Tza*_*har 7

如果您更改签名:

def zip[T, U](rdd1:RDD[T], rdd2:RDD[U]) : RDD[(T,U)] = {
Run Code Online (Sandbox Code Playgroud)

成:

def zip[T : ClassTag, U: ClassTag](rdd1:RDD[T], rdd2:RDD[U]) : RDD[(T,U)] = {
Run Code Online (Sandbox Code Playgroud)

这将编译.

为什么joinPairRDDFunctions(您RDD隐式转换为该类)的方法,它具有以下签名:

class PairRDDFunctions[K, V](self: RDD[(K, V)])
  (implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null)
Run Code Online (Sandbox Code Playgroud)

这意味着它的构造预计隐式的类型的值ClassTag[T]ClassTag[U],因为这些将被用作值类型(在VPairRDDFunctions定义).你的方法没有什么知识TU有,因此不能提供配套的隐含价值.这意味着隐式转换为PairRDDFunctions"失败"(编译器不执行转换),因此join无法找到该方法.

添加[K : ClassTag]implicit kt: ClassTag[K]向方法添加隐式参数的简写,然后由编译器使用并传递给构造函数PairRDDFunctions.

有关ClassTag的更多信息以及它们有用的内容,请参阅这篇好文章.