一、Rdd转化算子
1、【mapPartitions】遍历出集合(rdd)中的每一个元素,并对元素可以进一步操作;是对每个分区中的数据进行迭代;
2、【mapPartitionswithIndex】是对rdd中每个分区的遍历操作;
3、【repartition】可以对rdd进行重新分区,可以是超过原有分区个数,也可以小于原有分区个数。 默认会执行shuffle 即对分区中的数据重新计算;
4、【coalesce】算子也可以对rdd进行重新分区,这个分区只能是小于原有分区的值。coalesce是不会进行shuffle;
5、【partitionBy】rdd中存储的元素是元组类型,此时可以使用partitionby进行重新分区。参数为默认分区器 即HashParrtitioner 也可传入自定义分区;
二、实例
package com.cn.rddOperator
import org.apache.spark.rdd.RDD
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}
object Transformation04 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("transformation04").setMaster("local[1]")
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
/**
* mapPartitions:遍历出集合(rdd)中的每一个元素,并对元素可以进一步操作
* mapPartitions是对每个分区中的数据进行迭代
*/
val rdd1=sc.parallelize(List(1,2,3,4,5),3)
val rdd2: RDD[Int] = rdd1.mapPartitions(_.map(_*2))
println(rdd2.collect().toList)//List(2, 4, 6, 8, 10)
/**
* mapPartitionswithIndex 是对rdd中每个分区的遍历操作
*/
val Iter=(index:Int,iter:Iterator[(Int)])=>{
iter.map(x=>"partId:"+index+",value:"+x)
}
val rdd3: RDD[String] = rdd1.mapPartitionsWithIndex(Iter)
println(rdd3.collect().toBuffer)//ArrayBuffer(partId:0,value:1, partId:1,value:2, partId:1,value:3, partId:2,value:4, partId:2,value:5)
/**
* repartition可以对rdd进行重新分区,可以是超过原有分区个数,也可以小于原有分区个数
* 默认会执行shuffle 即对分区中的数据重新计算
*/
val rdd4: RDD[Int] = rdd1.repartition(5)
println(rdd4.partitions.length)//5
/**
* coalesce 算子也可以对rdd进行重新分区,这个分区只能是小于原有分区的值
* coalesce是不会进行shuffle
*/
val rdd5: RDD[Int] = rdd1.coalesce(5)
println(rdd5.partitions.length)//3
val rdd6: RDD[Int] = rdd1.coalesce(2)
println(rdd6.partitions.length)//2
/**
* rdd中存储的元素是元组类型,此时可以使用partitionby进行重新分区
* 参数为默认分区器 即HashParrtitioner 也可传入自定义分区
*/
val rdd7: RDD[(String, Int)] = sc.parallelize(List(("aa",1),("bb",2),("cc",3),("dd",4)),2)
val rdd8: RDD[(String, Int)] = rdd7.partitionBy(new HashPartitioner(4))
val rdd9: RDD[(String, Int)] = rdd7.repartition(5)
println(rdd8.partitions.length)//4
println(rdd9.partitions.length)//5
}
}