2017-06-08 1 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(_ + _) 
    } 
    } 

Bonjour, j'ai un problème mais il est possible que cette idée ne soit pas bonne. Je tente d'implémenter une fonction générique qui reçoit différents types. Lorsque créer un objets différents, par exemple TypeA et TypeB je veux envoyer à counterAttributeA -> count number of apparences of attribute 'a', mais la console envoyer cette erreur:Comment implémenter une fonction générique qui reçoit différents types scala

[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 

Tout le monde, vous pouvez me aider? Merci pour tout.

Répondre

2

Vous devez indiquer au compilateur que le type va être au moins BaseType afin qu'il sache qu'il aura accès à la propriété a.

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

fonctionne Votre recommandation correctement, merci de votre réponse –

+0

Si cela fonctionne correctement s'il vous plaît considérer [accepter la réponse] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an- réponse-travail). – zero323