RDD算子
RDD本身分为数值(value RDD)、双Value(value-value) 以及键值对(key-value)
value RDD
map
返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成(针对于结构变化)
案例:给定一个RDD集合,将集合中所有元素*2
val listRDD: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4, 5))
案例实现
//val mapRDD: RDD[Int] = listRDD.map(x => x*2)
val mapRDD: RDD[Int] = listRDD.map(_ * 2)
mapRDD.collect().foreach(println)
mapPartitions
mapPartitions是针对每个分区取进行计算,运算的效率要高于map;但是有可能出现内存溢出的情景
案例实现:
val mapPartRDD: RDD[Int] = listRDD.mapPartitions(data => {
data.map(_ * 2)
})
mapPartRDD.collect().foreach(println)
mapPartitionsWithIndex
映射同时可以获取分区号
案例:将集合中的元素和分区号结合元组
val listRDD: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4, 5))
案例实现
val mapPartIndexRDD: RDD[(String, Int)] = listRDD.mapPartitionsWithIndex((index, data) =>data.map(("分区号" + index, _))) mapPartIndexRDD.collect().foreach(println)
flatMap
flatMap的操作时将函数应用于RDD之中的每一个元素,将返回的迭代器中所有元素构成新的RDD
案例:将集合List(List(1,2,3),List(14,5,6))中的数据放入到一个list之中
val listRDD: RDD[List[Int]] = sc.makeRDD(List(List(1,2,3),List(14,5,6)))
案例实现:
val flatRDD: RDD[Int] = listRDD.flatMap(data => data) flatRDD.collect().foreach(println)
glom
将每个分区的数据单独形成一个数组
案例实现
val listRDD: RDD[Int] = sc.makeRDD(List(1,2,3,4,5,6,7,8,9