1. 说明
/*
* 1. 定义
* def glom(): RDD[Array[T]]
*
* 2. 功能
* 返回一个RDD,将每个分区内的所有元素合并成一个数组
* */
object RddTransitionOperator_glom extends App {
private val sc: SparkContext = CommonUtils.getSparkContext("mapPartitionsWithIndex operator")
private val rdd: RDD[Long] = sc.range(1, 10, 1, 2)
private val rdd1: RDD[Array[Long]] = rdd.glom()
rdd1.collect().foreach(e => println(e.mkString(",")))
// 1,2,3,4
// 5,6,7,8,9
sc.stop()
}
2. 需求: 计算所有分区最大值求和(分区内取最大值,分区间最大值求和)
object glomTestByMax extends App {
val sparkconf: SparkConf = new SparkConf().setMaster("local").setAppName("mapPartitionsWithIndexTest")
val sc: SparkContext = new SparkContext(sparkconf)
val rdd = sc.makeRDD(Array(1, 2, 3, 4, -1, -2, -3, -4), 2)
// 获取每个分区内的最大值
private val Rdd1: RDD[Int] = rdd.glom().map(_.max)
// 获取每个分区内的最大值
private val Rdd2: RDD[Int] = rdd.mapPartitions(
iter => List(iter.max).iterator
)
// 拉取所有分区,并求和
private val sum: Int = Rdd1.collect().sum
private val sum1: Int = Rdd2.collect().sum
println(sum)
println(sum1)
sc.stop()
}