阅读Spark文档后,我发现groupByKey
函数与reduceByKey
相比性能较低。但我需要的是获取某个键的average
,maximum
和minimum
值。我不认为这可以通过reduceByKey
方法完成。我可以创建一个自定义的reduceByKey
函数来实现这些目标吗?
答案 0 :(得分:2)
假设您有一个RDD[(String, Double)]
,并且您希望使用reduceByKey
计算双倍值的平均值,最小值,最大值。
这可以通过将值复制为您想要应用的操作多次,然后使用reduceByKey
应用不同的操作来完成。
像这样:
val srcData:RDD[(String, Double)] = ???
srcData.cache
val count = srcData.count
val baseData = srcData.map{case (k,v) => (k,(v,1,v,v))}
val aggregates = baseData.reduceByKey { case (v1,v2) =>
(v1._1 + v2._1, v1._2 + v2._2, Math.max(v1._3, v2._3), Math.min(v1._4,v2._4))}
val result = aggregates.collect()
.map{case (id, (sum, count, max, min)) => (id, sum/count, max, min)}