spark算子总结
- RDD介绍
rdd是(resilient distribute dataset)弹性分布式数据集
代表一个不可变,可分区,里面的元素可并行计算的集合
对rdd的改动,只能通过转换算子,转换成一个新的形态的rdd,所以调用转换算子返回一个新的rdd
- Spark 算子的分类
spark的算子分为行动算子和转换算子
调用转换算子是逻辑上的传递,并没有真正运算,实际数据并没有变化,调用行动算子后,才会发给执行器,才会实际在在执行器中执行运算。
- Spark RDD的创建
编译环境:IDEA
- 先获得一个sc对象
val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Demo1")
val sc = new SparkContext(sparkConf)
- rdd对象的创建 有两种方式makeRDD和parallize
val rdd: RDD[Int] = sc.makeRDD(1 to 10, 3)
val rdd: RDD[Int] = sc.parallelize(1 to 10, 3)
- 转换算子
1.map算子
从A类型到B类型的映射,一般用来RDD格式转换,rdd中的元素整体上分为value类型和key-value类型
val rdd: RDD[String] = sc.makeRDD(Array("张三","李四","王五","张三","李四","张三"))
val mapRDD: RDD[(String, Int)] = rdd.map((_, 1))
mapRDD.foreach(println)
result
(李四,1)
(张三,1)
(张三,1)
(李四,1)
(王五,1)
(张三,1)
2.mapPartitions是按分区数对每个分区的进行处理的,如果有M个分区,那么每次处理一个分区,处理M次,map是按数据条数处理的,有n条数据,每次就处理N条数据,map处理n次,内存足够大时,mapPartitions比map效率高
val rdd: RDD[String] = sc.makeRDD(Array("张三","李四","王五","张三","李四","张三"),3)
val mapPRdd: RDD[(String, Int)] = rdd.mapPartitions(iter => iter.map((_, 1)))
mapPRdd.foreach(println)
result
(王五,1)
(李四,1)
(张三,1)
(张三,1)
(张三,1)
(李四,1)
3,mapPartitionsWithIndex
val rdd: RDD[String] = sc.makeRDD(Array("张三","李四","王五","张三","李四","张三"),3)
val mapPI: RDD[(Int, (String, Int))] = rdd.mapPartitionsWithIndex((i, iter) => {
iter.map((_, 1)).map((i, _))
})
result
(2,(李四,1))
(0,(张三,1))
(1,(王五,1))
(0,(李四,1))
(2,(张三,1))
(1,(张三,1))
4.glom算子
将每一个分区的数据,装载到一个array中
val rdd: RDD[String] = sc.makeRDD(Array("张三","李四","王五","张三","李四","张三"),3)
val glomRdd: RDD[Array[String]] = rdd.glom