spark aggregateByKey-给出类型不匹配错误

时间:2017-09-14 15:19:43

标签: scala apache-spark

想要输出如下:(167,5)。我想要年龄和数量的总和

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:错误:类型不匹配;发现:(Int,Int)要求:   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 ))

1 个答案:

答案 0 :(得分: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))

Scala REPL对参数感到困惑。您可以使用简单的功能重现它:

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

使用时:

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

你会得到同样的错误。有趣的是,如果other的第二个参数是例如String,那么一切正常。

为了避免这种编译器混淆,你应该只用一个额外的()告诉编译器你想要一个元组