Spark 2.x管理与开发-Spark RDD的高级算子(二)aggregate*

聚合操作,类似于分组Group By

(1)先对局部进行聚合操作,再对全局进行聚合操作

(2)举例:

将每一个分区中的最大值加在一起

分成两步操作:

1)先在分区内部进行最大值操作

2)面对全局进行操作-求和:2+5=7

  • zeroValue: U:初始值,需要赋值

    后面是两个函数参数,第一个函数:表示局部操作的函数;

             第二个参数:表示全局操作的函数

  

 举一个字符的例子:

 

 

 

更复杂一点的例子

 

val rdd3 = sc.parallelize(List("12","23","345","4567"),2)

rdd3.aggregate("")((x,y) => math.max(x.length, y.length).toString, (x,y) => x + y)

结果可能是:”24”,也可能是:”42”

结果解析:

第一个分区有:”12”,”23”

   第一次比较:空字符串””和”12”进行比较-求出长度的最大值-2

   toString()之后2变为”2”

   第二次比较:将求出的”2”和”23”进行比较-求出长度的最大值-2

   toString()之后2变为”2”

第二个分区有:”34”,”4567”

   第一次比较:空字符串””和”34”进行比较-求出长度的最大值-2

   toString()之后2变为”2”

   第二次比较:将求出的”2”和”4567”进行比较-求出长度的最大值-4

   toString()之后4变为”4”

最后全局操作:拼接字符串”24”/”42”

——————————————————————————————

val rdd4 = sc.parallelize(List("12","23","345",""),2)

rdd4.aggregate("")((x,y) => math.min(x.length, y.length).toString, (x,y) => x + y)

结果是:”10”,也可能是”01”

结果分析:

第一个分区有:”12”,”23”

第一次比较:初始值-空字符串””和”12”进行比较-求出长度的最小值-0

toString()之后0变为”0”

第二次比较:将求出的”0”和”23”进行比较-求出长度的最小值-1

toString()之后1变为”1”

第二个分区有:”34”,””

第一次比较:初始值-空字符串””和”34”进行比较-求出长度的最小值-0

toString()之后0变为”0”

第二次比较:将求出的”0”和””进行比较-求出长度的最小值-0

toString()之后0变为”0”

最后全局操作:拼接字符串”10”/”01”

——————————————————————————————

val rdd5 = sc.parallelize(List("12","23","","345"),2)

rdd5.aggregate("")((x,y) => math.min(x.length, y.length).toString, (x,y) => x + y)

结果是:”11”

结果分析:

第一个分区有:”12”,”23”

第一次比较:初始值-空字符串””和”12”进行比较-求出长度的最小值-0

toString()之后0变为”0”

第二次比较:将求出的”0”和”23”进行比较-求出长度的最小值-1

toString()之后1变为”1”

第二个分区有:””,”34”

第一次比较:初始值-空字符串””和””进行比较-求出长度的最小值-0

toString()之后0变为”0”

第二次比较:将求出的”0”和”34”进行比较-求出长度的最小值-1

toString()之后1变为”1”

最后全局操作:拼接字符串”11”

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3