2016-10-12 7 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)]原因のメンバーではないでしょうか? .join(私はスパーク1.6にしています

は、私はすでにorg.apache.spark.rdd.RDD._ をインポートしようとしてきたし、それが直接に使用されたときに関数内のコードはうまく動作します関数定義の外側の2 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をご覧ください。

関連する問題