Scala 如何使用combineByKey?
我试图用combineByKey获得countByKey的相同结果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
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,因为我得到了错误的结果。