此功能似乎对我的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上使用时,函数内部的代码运行良好。
有什么想法吗?
答案 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}}定义)。您的方法不知道PairRDDFunctions
和T
是什么,因此无法提供匹配的隐式值。这意味着隐式转换为U
“失败”(编译器不执行转换),因此无法找到方法PairRDDFunctions
。
添加join
是向方法添加隐式参数[K : ClassTag]
的简写,然后由编译器使用该参数并传递给implicit kt: ClassTag[K]
的构造函数。
有关ClassTag的更多信息以及它们有用的内容,请参阅this good article。