spark中的reduceByKey里面的自定义函数

时间:2015-01-26 09:34:11

标签: scala apache-spark

我有一个数组Array [(Int,String)],它由整个数据集的键值对组成,其中key是列号,value是列的值。

所以,我想使用reduceByKey按键执行某些操作,如max,min,mean,median,quartile计算。

如何使用reduceByKey实现此目的,因为groupByKey会将大量数据泄露给磁盘。如何在reduceByKey中传递自定义函数。

或者有更好的方法来做到这一点。

谢谢!

1 个答案:

答案 0 :(得分:7)

您可以使用combineByKey跟踪相同转换中的sum,count,min,max值。为此,您需要3个功能:

  • 创建合并器功能 - 将初始化“组合值”'由min,max等组成
  • 合并值功能 - 这将为'组合值'
  • 添加另一个值
  • 合并合并器 - 将合并两个合并的值'一起

第二种方法是使用可累积物体或几个累加器。

请查看相关文档。如有必要,我可以提供一些例子。

<强>更新

以下是按键计算平均值的示例。您可以将其展开以计算最小值和最大值:

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})