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

时间:2016-10-12 07:38:35

标签: 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
}

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

  

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

我在Spark 1.6中,我已经尝试导入 org.apache.spark.rdd.RDD ._ 当函数直接在函数定义之外的两个RDD上使用时,函数内部的代码运行良好。

有什么想法吗?

1 个答案:

答案 0 :(得分:7)

如果您更改签名:

"karma": "0.13.18",
"karma-webpack": "1.7.0"

成:

def zip[T, U](rdd1:RDD[T], rdd2:RDD[U]) : RDD[(T,U)] = {

这将编译。

<强>为什么def zip[T : ClassTag, U: ClassTag](rdd1:RDD[T], rdd2:RDD[U]) : RDD[(T,U)] = { join的一种方法(您的PairRDDFunctions被隐式转换为该类),其具有以下签名:

RDD

这意味着它的构造函数需要类型为class PairRDDFunctions[K, V](self: RDD[(K, V)]) (implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null) ClassTag[T]隐式值,因为它们将用作值类型(ClassTag[U]中的V {1}}定义)。您的方法不知道PairRDDFunctionsT是什么,因此无法提供匹配的隐式值。这意味着隐式转换为U“失败”(编译器不执行转换),因此无法找到方法PairRDDFunctions

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

有关ClassTag的更多信息以及它们有用的内容,请参阅this good article