持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
什么是RDD?
RDD(Resilient Distributed Datasets弹性分布式数据集)是一个容错的、并行的数据结构,可以简单的把RDD理解成一个提供了许多操作接口的数据集合,和一般数据集不同的是,其实际数据分布存储于一批机器中(内存或磁盘中)。
RDD的一些特征:
RDD可以让用户显式地将数据存储到磁盘和内存中,并且还能控制数据的分区。每个RDD都具有五大特征,具体如下。
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经过“行动”操作才会被真正计算处理,并输出到外部数据源中,若是中间的数据结果需要复用,则可以进行缓存处理,将数据缓存到内存中。
转换算子:
RDD处理过程中的“转换”操作主要用于根据已有RDD创建新的RDD,供给下一个转换算子使用。下表中列举了一些常用转换算子操作的API,具体如下。
filter(func)
是转换算子 作用:保留通过函数func,返回值为true的元素,组成新的RDD。 示例:筛选出data RDD中元素大于2的元素,组成一个新的RDD result。
map(func)
是转换算子 作用:将原来RDD的每个元素通过map中的用户自定义函数func转换成一个新的RDD,map操作不会改变RDD的分区数目。 示例:将data RDD中每个元素转换为各元素的平方,再组成一个新的RDD。
flapMap(func)
是转换算子 作用:对集合中的每个元素进行map操作再扁平化。
groupByKey()
是转换算子
主要用于(K,V)键值对类型的RDD,将具有相同Key的Value进行分组,会返回一个新的(Key,Iterable)形式的RDD。
示例:
reduceByKey(func)
是转换算子
主要用于(K,V)键值对类型的RDD,将键值对RDD按键分组后进行聚合,返回一个(K,V)类型键值对组成的新RDD。
其中新RDD每个键的值使用给定的reduce函数func进行聚合,该函数必须是(V,V)=>V类型
示例:统计每个键出现的次数。
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的分区个数,默认排序后的分区个数和排序之前的个数相等。
示例:按照每个元素的第二个值进行降序排序。
distinct( )
是转换算子 作用:针对RDD中重复的元素,只保留一个元素。
union(otherDataset)
合并RDD,需要保证两个RDD元素类型一致。 合并rdd1和rdd2
intersection(otherDataset)
找出两个RDD的交集,需要保证两个RDD元素类型一致。 找出c_rdd1和c_rdd2中相同的元素
subtract (otherDataset)
找出两个RDD之间的差集,要保证两个RDD元素类型一致 找出rdd1与rdd2之间的差集
cartesian(otherDataset)
笛卡尔积就是将两个集合的元素两两组合成一组。