Spark的aggregate算子
aggragete算子作为spark的算子之一,虽然没有map,reduce算子使用的多但是也是一个不容忽略的算子,但是关于这个算子的用法很多解释都含糊不清 ,下面就记载下来以备以后观看。
aggregate在scala语言中本来就存在,它的输入值和返回值的类型可以不一致,而reduce函数输入和输出数据类型 必须一致。首先他需要接受一个输入的初始值,然后再接受一个函数f1,把数据进行分块,按照分块计算各个分块之间的数据得到一个结果,它还有一个函数f2参数,使用这个参数对分块求得的结果再次进行计算。
在spark中aggregate也是接受一个初始值,在各个分区之间应用f1函数,然后分区之间应用f2函数最后得到一个结果进行返回。
eg:”a1”,(“A”,”1,2,3”) 这种字符串的 “1,2,3”为某种聚合值,对所有的这种类型的值按照列进行累加求和,下面就可以使用这种函数进行操作。以下为原生scala中的操作,在spark中该函数(算子)的使用方法也是相同的。
object Fun{
def main(args: Array[String]): Unit = {
val seq = Seq(("a1",("A","1,2,3")),("a2",("A","1,2,3")),("a3",("A","1,2,3")),("a4",("A","1,2,3")))
val res = seq.aggregate("0,0,0")( (x,y) => getAddition(x, y._2._2), (x,y) => getAddition(x,y))
println(res)
}
def getAddition(fist:String,second:String):String ={
val s1 = fist.split("\\,")
val s2 = second.split("\\,")
val resSeq = for (i <- 0 until s1.length) yield (s1(i).toInt + s2(i).toInt).toString
resSeq.mkString(",")
}
}
运行结果:
4,8,12
在spark中使用算子 就不举例说明了,因为和scala中接受的参数一致,都是需要一个初始值,然后两个函数作为参数。