想要输出如下:(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 ))
答案 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,那么一切正常。
为了避免这种编译器混淆,你应该只用一个额外的()告诉编译器你想要一个元组