spark 中 reduceByKey 内的自定义函数

Custom function inside reduceByKey in spark

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

所以,我想使用reduceByKey键来执行某些操作,例如max,min,mean,median,quartile calculations

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

或者有更好的方法吗

谢谢!!

您可以使用 combineByKey 在同一个转换中跟踪总和、计数、最小值、最大值。为此,您需要 3 个函数:

  • 创建组合器函数 - 这将初始化 'combined value' 由最小值、最大值等组成
  • merge values 函数 - 将向 'combined value'
  • 添加另一个值
  • 合并组合器 - 将两个 'combined values' 合并在一起

第二种方法是使用一个 Accumulable 对象或多个 Accumulators。

请检查这些文件。如有必要,我可以提供一些示例。

更新:

这里有一个按键计算平均值的例子。您也可以扩展它来计算最小值和最大值:

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