Spark RDD的一些常用转换算子

205 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情 添加标题.png

什么是RDD?

RDD(Resilient Distributed Datasets弹性分布式数据集)是一个容错的、并行的数据结构,可以简单的把RDD理解成一个提供了许多操作接口的数据集合,和一般数据集不同的是,其实际数据分布存储于一批机器中(内存或磁盘中)。

image.png

RDD的一些特征:

RDD可以让用户显式地将数据存储到磁盘和内存中,并且还能控制数据的分区。每个RDD都具有五大特征,具体如下。

image.png

RDD的创建方式:

1、从本地文件系统加载数据创建RDD

scala> val test=sc.textFile("file:///export/data/test.txt")
test: org.apache.spark.rdd.RDD[String]=file:///export/data/test.txt MapPartitionsRDD[1] at textFile  at <console>:24

2、从HDFS中加载数据创建RDD

scala> val testRDD=sc.textFile("/data/test.txt")
testRDD:org.apache.spark.rdd.RDD[String]=/data/test.txt MapPartitionsRDD[1] at textFile at  <console>:24

3、通过并行集合创建RDD

Spark可以通过并行集合创建RDD。即从一个已经存在的集合、数组上,通过SparkContext对象调用parallelize()方法创建RDD。

scala> val array=Array(1,2,3,4,5)
array: Array[Int]=Array(1,2,3,4,5)
scala> val arrRDD=sc.parallelize(array)
arrRDD: org.apache.spark.rdd.RDD[Int]=ParallelcollectionRDD[6] at parallelize at <console>:26

RDD的处理过程:

Spark用Scala语言实现了RDD的API,程序开发者可以通过调用API对RDD进行操作处理。RDD经过一系列的“转换”操作,每一次转换都会产生不同的RDD,以供给下一次“转换”操作使用,直到最后一个RDD经过“行动”操作才会被真正计算处理,并输出到外部数据源中,若是中间的数据结果需要复用,则可以进行缓存处理,将数据缓存到内存中。

image.png

转换算子:

RDD处理过程中的“转换”操作主要用于根据已有RDD创建新的RDD,供给下一个转换算子使用。下表中列举了一些常用转换算子操作的API,具体如下。

image.png

filter(func)

是转换算子 作用:保留通过函数func,返回值为true的元素,组成新的RDD。 示例:筛选出data RDD中元素大于2的元素,组成一个新的RDD result。

map(func)

是转换算子 作用:将原来RDD的每个元素通过map中的用户自定义函数func转换成一个新的RDD,map操作不会改变RDD的分区数目。 示例:将data RDD中每个元素转换为各元素的平方,再组成一个新的RDD。

flapMap(func)

是转换算子 作用:对集合中的每个元素进行map操作再扁平化。

image.png

groupByKey()

是转换算子 主要用于(K,V)键值对类型的RDD,将具有相同Key的Value进行分组,会返回一个新的(Key,Iterable)形式的RDD。
示例:

image.png

reduceByKey(func)

是转换算子 主要用于(K,V)键值对类型的RDD,将键值对RDD按键分组后进行聚合,返回一个(K,V)类型键值对组成的新RDD。 其中新RDD每个键的值使用给定的reduce函数func进行聚合,该函数必须是(V,V)=>V类型
示例:统计每个键出现的次数。

image.png

mapValues(func)

针对键值对(Key,Value)类型的数据中的Value进行map操作,而不对Key进行处理。
示例:

scala> val rdd=sc.parallelize(Array(("panda",0),("pink",3),("pirate",1),("panda",1),("pink",4)))
scala> rdd.mapValues(x=>(x,1)).collect

sortBy(f:(T) => K, ascending,numPartitions)

是转换算子 作用:是可以对标准RDD进行排序。 sortBy()可接受如下三个参数。 f:(T) => K:左边是要被排序对象中的每一个元素,右边返回的值是元素中要进行排序的值。
ascending:决定排序后RDD中的元素是升序还是降序,默认是true,也就是升序,false为降序排序。
numPartitions:该参数决定排序后的RDD的分区个数,默认排序后的分区个数和排序之前的个数相等。

示例:按照每个元素的第二个值进行降序排序。

image.png

distinct( )

是转换算子 作用:针对RDD中重复的元素,只保留一个元素。

image.png

union(otherDataset)

合并RDD,需要保证两个RDD元素类型一致。 合并rdd1和rdd2

image.png

intersection(otherDataset)

找出两个RDD的交集,需要保证两个RDD元素类型一致。 找出c_rdd1和c_rdd2中相同的元素

image.png

subtract (otherDataset)

找出两个RDD之间的差集,要保证两个RDD元素类型一致 找出rdd1与rdd2之间的差集

image.png

cartesian(otherDataset)

笛卡尔积就是将两个集合的元素两两组合成一组。

image.png