2016-10-09 14 views
4

私はScalaとSparkの両方が新しいので、抽象クラスのときにaggregateByKeyがコンパイルできない理由を誰かが説明できると思っています。これは私が思い付くことができ、最も簡単な例についてです:抽象クラスのときにAggregateByKeyがコンパイルされない

与え
import org.apache.spark.{SparkConf, SparkContext} 
import org.apache.spark.rdd.RDD 

abstract class AbstractKeyCounter[K] { 

    def keyValPairs(): RDD[(K, String)] 

    def processData(): RDD[(K, Int)] = { 
    keyValPairs().aggregateByKey(0)(
     (count, key) => count + 1, 
     (count1, count2) => count1 + count2 
    ) 
    } 

} 

class StringKeyCounter extends AbstractKeyCounter[String] { 

    override def keyValPairs(): RDD[(String, String)] = { 
    val sc = new SparkContext(new SparkConf().setMaster("local").setAppName("counter")) 
    val data = sc.parallelize(Array("foo=A", "foo=A", "foo=A", "foo=B", "bar=C", "bar=D", "bar=D")) 
    data.map(_.split("=")).map(v => (v(0), v(1))) 
    } 

} 

Error:(11, 19) value aggregateByKey is not a member of org.apache.spark.rdd.RDD[(K, String)] 
    keyValPairs().aggregateByKey(0)(
       ^

を私が代わりに、単一の具象クラスを使用している場合は、それがコンパイルされ、正常に実行されます。

import org.apache.spark.{SparkConf, SparkContext} 
import org.apache.spark.rdd.RDD 

class StringKeyCounter { 

    def processData(): RDD[(String, Int)] = { 
    val sc = new SparkContext(new SparkConf().setMaster("local").setAppName("counter")) 
    val data = sc.parallelize(Array("foo=A", "foo=A", "foo=A", "foo=B", "bar=C", "bar=D", "bar=D")) 
    val keyValPairs = data.map(_.split("=")).map(v => (v(0), v(1))) 

    keyValPairs.aggregateByKey(0)(
     (count, key) => count + 1, 
     (count1, count2) => count1 + count2 
    ) 
    } 

} 

私は何が欠けていますか?

答えて

3

を変更した場合:これは、コンパイルします

abstract class AbstractKeyCounter[K : ClassTag] { 

abstract class AbstractKeyCounter[K] { 

へ。

なぜaggregateByKeyは、次のシグネチャを有するPairRDDFunctions方法(あなたRDDが暗黙そのクラスに変換される)、である。

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

これは、コンストラクタはタイプClassTag[K]vt: ClassTag[V]暗黙値を期待します。あなたの抽象クラスは、Kが何であるかについての知識がないため、暗黙の値と一致することはできません。つまり、PairRDDFunctionsへの暗黙的な変換が「失敗」(コンパイラは変換を実行しないため)のメソッドaggregateByKeyが見つかりません。 [K : ClassTag]を追加

は、コンパイラによって使用され、PairRDDFunctionsのコンストラクタに渡された抽象クラスのコンストラクタへの暗黙の引数implicit kt: ClassTag[K]を追加するための省略表現です。

ClassTagsの詳細については、this good articleを参照してください。

関連する問題