持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情
Transformation转换算子在SparkCore中也是比较重要的概念,也是面试的重点。它又分为 单Value类型、双Value类型、Key-Value类型,本篇文章我们主要说一下 单Value类型。
1. map():映射
def map[U:ClassTag](f:T => U):RDD[U]
功能: 参数f是一个函数,它可以接收一个参数。当某个RDD执行map方法时,会遍历该RDD中的每一个数据项,并依次应用 f函数,从而产生一个新的RDD。即,这个新的RDD中的每一个元素都是原来RDD中每一个元素依次应用f函数而得到的。
需求:创建一个1-4数组的RDD,两个分区,将所有的元素 *2 形成新的RDD,如下图所示
2. mapPartitions(): 以分区为单位执行Map
def mapPartitions[U:ClassTag](f:Iterator[T] => Iterator[U]
功能:Map是一次处理一个元素,mapPartitions是一次处理一个分区的数据
3. mapPartitionsWithIndex(): 带分区号且以分区为单位执行Map
功能:类似于mapPartitions,比mapPartitions多一个整数参数表示分区号
4. flatMap():扁平化
def flatMap[U: ClassTag](f: T => TraversableOnce[U]): RDD[U]
功能:与map操作类似,将RDD中的每一个元素通过应用f函数依次转换为新的元素,并封装到RDD中。
区别:在flatMap操作中,f函数的返回值是一个集合,并且会将每一个该集合中的元素拆分出来放到新的RDD中。
5. glom(): 分区转换为数组
def glom(): RDD[Array[T]]
功能:将RDD中每一个分区变成一个数组,并放置在新的RDD中,数组中元素的类型与原分区中元素类型一致
6. groupBy(): 分组
def groupBy[K](f:T => K)(implicit kt: ClassTag[K]): RDD[(K,lterable[T])]
功能:分组,按照传入函数的返回值进行分组。将相同的key对应的值放入一个迭代器。
7. filter(): 过滤
def filter(f:T=> Boolean): RDD[T]
功能:接收一个返回值为布尔类型的函数作为参数。当某个RDD调用filter方法时,会对该RDD中每一个元素应用f函数,如果返回值类型为true,则该元素会被添加到新的RDD中。
8. sample(): 采样
功能:从大量的数据中采样
9. distinct(): 去重
功能: 对内部元素去重,并将去重后的元素放到新的RDD中。
10. coalesce():合并分区
功能:缩减分区数,用于大数据集过滤后,提高小数据集的执行效率。
11. repartition(): 重新分区(执行Shuffle)
功能:该操作内部执行的是coalesce操作,参数shuffle的默认值为true。无论是将分区数多的RDD转换为分区数少的RDD,还是将分区数少的RDD转换为分区数多的RDD,repartition操作都可以完成,因为无论如何都会经shuffle过程。
12. sortBy(): 排序
功能:该操作用于排序数据。在排序之前,可以将数据通过f函数进行处理,之后按照f函数处理的结果进行排序,默认为正序排列。排序后新产生的RDD的分区数与原RDD的分区数一致。
13. pipe(): 调用脚本
功能:管道,针对每个分区,都调用一次shell脚本,返回输出的RDD。