Scala 如何使用combineByKey?

Scala 如何使用combineByKey?,scala,apache-spark,Scala,Apache Spark,我试图用combineByKey获得countByKey的相同结果 scala> ordersMap.take(5).foreach(println) (CLOSED,1) (PENDING_PAYMENT,2) (COMPLETE,3) (CLOSED,4) (COMPLETE,5) 这是我的输入,我想使用combineByKey获得countByKey的输出 countByKey的输出(正确) 我用过combineByKey val combine = ordersMap.combi

我试图用combineByKey获得countByKey的相同结果

scala> ordersMap.take(5).foreach(println)
(CLOSED,1)
(PENDING_PAYMENT,2)
(COMPLETE,3)
(CLOSED,4)
(COMPLETE,5)
这是我的输入,我想使用combineByKey获得countByKey的输出

countByKey的输出(正确)

我用过combineByKey

val combine = ordersMap.combineByKey(  x => 1 , (a:Int ,v) => a +1 , (a : Int,v : Int) => a +1  )
(PENDING_PAYMENT,7600)
(CLOSED,3878)
(CANCELED,699)
(PAYMENT_REVIEW,368)
(PENDING,3764)
(ON_HOLD,1896)
(PROCESSING,4100)
(SUSPECTED_FRAUD,773)
(COMPLETE,11372)
但我得到了意想不到的结果,我不知道为什么

来自combineByKey的结果

val combine = ordersMap.combineByKey(  x => 1 , (a:Int ,v) => a +1 , (a : Int,v : Int) => a +1  )
(PENDING_PAYMENT,7600)
(CLOSED,3878)
(CANCELED,699)
(PAYMENT_REVIEW,368)
(PENDING,3764)
(ON_HOLD,1896)
(PROCESSING,4100)
(SUSPECTED_FRAUD,773)
(COMPLETE,11372)

谢谢,那是因为你用错了函数。传递给
combineByKey
的最后一个函数需要组合两个累加器类型的值(
C
),这两个值可能是在不同的执行器上计算的。这就是为什么函数名被称为
mergeCombiners

文件:

combineByKey[C](createCombiner: (V) ⇒ C, 
                mergeValue: (C, V) ⇒ C, 
                mergeCombiners: (C, C) ⇒ C): RDD[(K, C)]
您应该如何应用合并合并器:

val combine = 
  ordersMap.combineByKey(_ => 1 , (a: Int, _) => a + 1, (a: Int, v: Int) => a + v)

你能详细解释一下“但我得到了意想不到的结果,我不知道为什么。”?请包括例外情况以供将来参考。嗨@Jacek Laskowski,我使用(a,b)=>a+1错误地添加了执行人的值,但这是错误的。它应该是(a,b)=>a+b,因为我得到了错误的结果。