2017-09-14 29 views
1

需要如下輸出:(167,5)。我想年齡之和計算spark aggregateByKey - 給出類型不匹配錯誤

val people = List(("Ganga",43,'F'),("John",28,'M'),("Lolitha",33,'F'),("Don't Know",18,'T')) 
val peopleRDD = sc.parallelize(people) 
val kv = peopleRDD.map(x=>((x._1,x._3),x._2)) 
val result = kv.aggregateByKey(0,0)((x : (Int,Int) , y : Int)=> (x._1+y,x._2+1),(x:(Int,Int),y:(Int,Int))=>(x._1+y._1,x._2+y._2)) 

得到一個錯誤的結果爲:

console>:33: error: type mismatch; found : (Int, Int) required: Int

val result = kv.aggregateByKey(0,0)((x : (Int,Int) , y : Int)=> (x._1+y,x._2+1),(x:(Int,Int),y:(Int,Int))=>(x._1+y._1,x._2+y._2))

+0

哪裏'167,5'從何而來?當我總結年齡並且計數似乎是4時,我沒有得到這個數字。 – Psidom

回答

1

這是因爲你需要額外的():

val result = kv.aggregateByKey((0,0))((x : (Int,Int) , y : Int)=> (x._1+y,x._2+1),(x:(Int,Int),y:(Int,Int))=>(x._1+y._1,x._2+y._2)) 

斯卡拉REPL就會犯糊塗關於參數。你可以用簡單的函數重現:

def func[T](arg: T)(other : (T, Int) => T) = arg 

當你使用:

func(0,0)((a : Int, b : Int) => a) 

你會得到同樣的錯誤。有趣的是,如果other的第二個參數是String,那麼一切正常。

爲了避免這種混亂的編譯器,你應該只是一個額外的()來告訴編譯器,你想有一個元組