Spark combineByKey包含包含元组

时间:2017-02-20 16:47:42

标签: scala apache-spark tuples rdd

所以我有一个包含以下类型值的火花RDD

RDD[(Key:Int, (val1:Double, val2:Double))]

例如

(1,(1,1))
(1,(1,2))
(1,(1,3))
(1,(1,4))
(1,(1,5))
(2,(1,1))
(2,(1,2))
(2,(1,3))
(2,(1,4))
(2,(1,5))

其中Int是键,而元组包含两个Double值

我想应用combineByKey操作,其中每个键我们执行以下操作

val2/val1

我基本上想要为每次出现的密钥找到这两个值的除法,然后找到给定密钥的平均值。因此,对于createCombiner,我们将划分值并创建一个计数器。 对于mergeValue,我想为给定的键划分这些值,然后将它们加到前一个值并增加计数器。

最后对于mergeCombiner,求和组合器的值并将它们除以值的总数(除法可以在单独的映射中完成?)

我的问题是,我似乎无法找到任何在一对上运行combineByKey的示例,其中值是元组而不是单个Integer值。

我尝试编写以下代码

arr2.combineByKey((v) => (v._2/v._1, 1),\\ Creating Combiner
(acc: (Double, Int), q:(Double,Double)) => ((q._2/q._1)+acc._1,acc._2+1), \\Merging Values
(acc1: (Double, Int), acc2: (Double, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2)) \\Merging Combiners

但它为合并值部分

提供了以下错误
type mismatch;  found   : ((Double, Int), (Double, Double)) => (Double, Int)  required: (?, (Int, Int)) => ?

有人可以帮助我,帮助我理解我做错了什么。如何访问元组的值并将它们分开然后将它们添加到先前的值?

任何帮助都将受到高度赞赏

1 个答案:

答案 0 :(得分:1)

在merge参数中q上声明的类型是罪魁祸首,另外你需要在除法之前转换为double以获得正确的值

arr2.combineByKey((v) => (v._2.toDouble / v._1, 1),
(acc: (Double, Int), q:(Int,Int)) => ((q._2/q._1)+acc._1,acc._2+1),
(acc1: (Double, Int), acc2: (Double, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2))