我有一个数组Array [(Int,String)],它由整个数据集的键值对组成,其中key是列号,value是列的值。
所以,我想使用reduceByKey按键执行某些操作,如max,min,mean,median,quartile计算。
如何使用reduceByKey实现此目的,因为groupByKey会将大量数据泄露给磁盘。如何在reduceByKey中传递自定义函数。
或者有更好的方法来做到这一点。
谢谢!
答案 0 :(得分:7)
您可以使用combineByKey跟踪相同转换中的sum,count,min,max值。为此,您需要3个功能:
第二种方法是使用可累积物体或几个累加器。
请查看相关文档。如有必要,我可以提供一些例子。
<强>更新强>
以下是按键计算平均值的示例。您可以将其展开以计算最小值和最大值:
def createComb = (v:Double) => (1, v)
def mergeVal:((Int,Double),Double)=>(Int,Double) =
{case((c,s),v) => (c+1, s+v)}
def mergeComb:((Int,Double),(Int,Double))=>(Int,Double) =
{case((c1,s1),(c2,s2)) => (c1+c2, s1+s2)}
val avgrdd = rdd.combineByKey(createComb, mergeVal, mergeComb,
new org.apache.spark.HashPartitioner(rdd.partitions.size))
.mapValues({case(x,y)=>y/x})