一、 数值型RDD算子之转换算子
1、 map算子
map算子是将RDD中的每一个元素通过map算子计算后得到一个新的结果,新的结果为一个新的RDD
object MapOperator {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("map").setMaster("local[2]")
val sc = new SparkContext(conf)
val rdd: RDD[Int] = sc.makeRDD(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 0))
val rdd1: RDD[Int] = rdd.map((a: Int) => {
a * 3
})
rdd1.foreach(println(_))
val rdd2: RDD[String] = sc.makeRDD(Array("hadoop", "spark", "flink", "hadoop"))
val rdd3: RDD[(String, Int)] = rdd2.map((word: String) => {
(word, 1)
})
rdd3.foreach(println(_))
sc.stop()
}
}
2、 mapPartitions算子
和map类似,区别在于mapPartitions是对每一个分区操作
object MapPartitionsOperator {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("mapPartitions").setMaster("local[2]")
val sc = new SparkContext(conf)
val rdd:RDD[Int] = sc.makeRDD(Array(1,2,3,4,5,6,7,8),4)
val rdd1:RDD[Int] = rdd.mapPartitions((a:Iterator[Int]) =>{
var listBuffer:ListBuffer[Int] = ListBuffer()
for( num <- a ){
println(s"处理了一个分区数据$num")
listBuffer.append(num*3)
}
listBuffer.iterator
})
rdd1.foreach(println(_))
sc.stop()
}
}
3、 mapPartitionsWithIndex算子
和map类似,区别在于mapPartitionsWithIndex是对每一个分区操作并且带有索引
object MapPartitionsWithIndex {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("mapPartitionsWithIndex").setMaster("local[2]")
val sc = new SparkContext(conf)
val rdd:RDD[Int] = sc.makeRDD(Array(1,2,3,4,5,6,7,8),4)
val rdd1:RDD[Int] = rdd.mapPartitionsWithIndex((index:Int,data:Iterator[Int])=>{
val listBuffer:ListBuffer[Int] = ListBuffer()
for(num <- data){
println(s"正在处理$index 分区的数据$num")
listBuffer.append(num *3)
}
listBuffer.iterator
})
rdd1.foreach(println(_))
sc.stop()
}
}
4、 flatMap压扁算子
原来的RDD一条数据经过flatMap算子操作返回一个集合数据,集合中的每一条数据都是新的RDD中的数据
object FlatMapOperator {
def