所以我有一个包含以下类型值的火花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)) => ?
有人可以帮助我,帮助我理解我做错了什么。如何访问元组的值并将它们分开然后将它们添加到先前的值?
任何帮助都将受到高度赞赏
答案 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))