2017-06-08 5 views
0
import org.apache.spark.{ SparkConf, SparkContext } 
    import org.apache.spark.rdd.RDD 

    class BaseType(val a: String) extends Serializable { 
    override def toString = "(" + a + ")" 
    } 
    class TypeA(a: String, val b: String) extends BaseType(a) { 
    override def toString = "(" + a + "," + b + ")" 
    } 
    class TypeB(a: String, val b: String) extends BaseType(a) { 
    override def toString = "(" + a + "," + b + ")" 
    } 

    object EntityInheritance { 
    def main(args: Array[String]) = { 

    val sparkConf = new SparkConf() 
     .setMaster("local[*]") 
     .setAppName("EntityInheritance Sample") 

    val sc = new SparkContext(sparkConf) 

    val text_file = sc.textFile("/dqa/sample_logs/tipologies/entityInheritance.txt") 
    val items = text_file.flatMap(_.split("\n")) 

     val itemsRDDa = items.map(newInstanceA(_)) 
     itemsRDDa.foreach { rdd => println(rdd) } 
     val countAa = countersAttributeA[TypeA](itemsRDDa) 

     val itemsRDDb = items.map(newInstanceB(_)) 
    itemsRDDb.foreach { rdd => println(rdd) } 
     val countBa = countersAttributeA[TypeB](itemsRDDb) 

    sc.stop() 
    } 

    def newInstanceA(str: String): TypeA = { 
     val parts = str.split(" ") 
     new TypeA(parts(0), parts(1)) 
    } 

    def newInstanceB(str: String): TypeB = { 
     val parts = str.split(" ") 
     new TypeB(parts(0), parts(1)) 
    } 

    // I want to implement a generic function that receives RDD[TypeA] or RDD[TypeB] 
    // it's a simple example 
    def countersAttributeA[A](rdd: org.apache.spark.rdd.RDD[A]) = { 
     rdd 
     .map(s => (s.a, 1)) 
     .reduceByKey(_ + _) 
    } 
    } 

こんにちは、私は問題がありますが、この考えが良くない可能性があります。異なる種類のスカラを受け取る汎用関数を実装する方法

さまざまなタイプを受け取る汎用関数を実装しようとしています。とき、私はcounterAttributeA -> count number of apparences of attribute 'a'に送信するが、コンソールは、このエラーを送信する例タイプAとタイプBのためのさまざまなオブジェクトを作成する:あなたは私を助けることができる

[error] /src/main/scala/org/sparklambda/testing/EntityInheritance.scala:53: value a is not a member of type parameter A 
[error]  .map(s => (s.a, 1)) 
[error]     ^
[error] one error found 

誰もが?全てに感謝。

答えて

2

aプロパティにアクセスできることを知るには、タイプが少なくともBaseTypeになることをコンパイラに伝える必要があります。

def countersAttributeA[A <: BaseType](rdd: org.apache.spark.rdd.RDD[A]) 
+0

あなたの勧告が正常に動作しますが、それが正常に動作する場合、あなたの答え –

+0

のための感謝と、[答えを受け入れる]ご検討ください(https://meta.stackexchange.com/questions/5234/how-does-accepting-an-答 - 仕事)。 – zero323

関連する問題