RDD特点
- 在已有的RDD上创建一个新的RDD
- 延迟执行(lazy), Transformation 的时候不执行,在促发action的时候执行。
map(func) 函数功能说明
返回一个新的分布式数据集,由每个原元素经过func函数转换后组成。新的分布式数据集和原数据集的形式是一样的。
将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素。输入分区与输出分区一对一,即:有多少个输入分区,就有多少个输出分区。
上手使用
代码测试
在hdfs上放一个文件1.txt
打开spark-shell
spark-shell --master spark://master:7077(重要的事情说多遍,spark-shell和spark-submit核心的参数是差不多的)
Spark-shell 输入map测试代码
创建RDD
var data = sc.textFile("/qgzang/1.txt")
使用map算子
var mapResult = data.map(line => line.split("\\s+"))
运算map算子结果
mapResult.collect()
输出:
res0: Array[Array[String]] = Array(Array(hello, world), Array(hello, spark), Array(hello, hive))
原理图
图中,每个方框表示一个RDD分区,左侧的分区经过用户自定义函数f:T->U映射为右侧的新的RDD分区。但是实际只有等到Action算子触发后,这个f函数才会和其他函数在一个Stage中对数据进行运算。 V1输入f转换输出V’ 1。
源码
/**
* Return a new RDD by applying a function to all elements of this RDD.
*/
def map[U: ClassTag](f: T => U): RDD[U] = {
val cleanF = sc.clean(f)
new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
}