spark中groupbykey的低性能
Low performance of groupbykey in spark
阅读Spark文档后,我发现groupByKey
函数与reduceByKey
相比性能较低。但是我需要的是获取某个键的average
、maximum
和minimum
值。我不认为这可以通过 reduceByKey
方法来完成。我可以创建一个自定义的 reduceByKey
函数来实现这些目标吗?
假设您有一个 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)}
阅读Spark文档后,我发现groupByKey
函数与reduceByKey
相比性能较低。但是我需要的是获取某个键的average
、maximum
和minimum
值。我不认为这可以通过 reduceByKey
方法来完成。我可以创建一个自定义的 reduceByKey
函数来实现这些目标吗?
假设您有一个 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)}