2016-10-12 24 views
1

這個功能似乎適用於我的IDE:值連接不是org.apache.spark.rdd.RDD [(龍,T)的成員

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

但是,當我編譯,我得到:

值加入不 org.apache.spark.rdd.RDD [(長,T)]可能的原因中的一員:也許分號 這個值之前加入缺失? 。加入(

我在星火1.6,我已經試圖導入org.apache.spark.rdd.RDD._ 和函數內部的代碼效果很好,當它被直接用於函數定義的公寓外面有兩個RDDS

任何想法

回答

6

如果更改簽名:?

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)] = { 

這會編譯。

爲什麼joinPairRDDFunctions的方法(您的RDD被隱式轉換爲類),其具有以下特徵:

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

這意味着它的構造期望的類型ClassTag[T]ClassTag[U]值,因爲這些將被使用作爲值類型(PairRDDFunctions定義中的V)。您的方法不知道TU是什麼,因此無法提供匹配的隱式值。這意味着隱式轉換爲PairRDDFunctions「失敗」(編譯器不執行轉換),因此無法找到方法join

添加[K : ClassTag]是爲方法添加隱式參數implicit kt: ClassTag[K]的簡寫,然後由編譯器使用,並傳遞給構造函數PairRDDFunctions

有關ClassTags的更多信息,請參閱this good article

相關問題