Saprk map&mapPartitions 功能
2者的功能为:对每个元素进行结构转换,但是2者略有区别
-
map 算子
每次处理一条数据
,而 mapPartitions 算子每次处理一个分区的数据
-
map 算子如果一个分区的数据没有处理完,那么所有的数据都不会释放,即使前面已经处理完的数据也不会释放,所以
容易出现内存溢出,
但是效率高,所以当内存空间足够大时,推荐使用mapPartitions算子
案例演示
目标:将val rdd: RDD[Int] = sc.parallelize(List(1, 2, 3, 4), numSlices = 2) 扩大2倍后输出到控制台
package com.xcu.bigdata.spark.core.pg02_rdd.pg022_rdd_transform
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
* @Desc : map:对每个元素进行处理
* mapPartitions:将待处理的数据以分区为单位发送到计算节点进行处理
*/
object Spark01_MapPartitions {
def main(args: Array[String]): Unit = {
//创建配置文件
val conf: SparkConf = new SparkConf().setAppName("Spark01_MapPartitions").setMaster("local[*]")
//创建SparkContext,该对象是提交的入口
val sc = new SparkContext(conf)
//创建RDD
val rdd: RDD[Int] = sc.parallelize(List(1, 2, 3, 4), numSlices = 2)
val resRDD: RDD[Int] = rdd.mapPartitions(
datas => { //这里的datas是指的是每一分区的数据
datas.map(elem => elem * 2) //这里的map不是rdd了,是一个集合的方法
}
)
//打印输出
resRDD.collect().foreach(println)
//释放资源
sc.stop()
}
}
输出:
2
4
6
8