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
誰もが?全てに感謝。
あなたの勧告が正常に動作しますが、それが正常に動作する場合、あなたの答え –
のための感謝と、[答えを受け入れる]ご検討ください(https://meta.stackexchange.com/questions/5234/how-does-accepting-an-答 - 仕事)。 – zero323