RDD简介
RDD全称为弹性分布式数据集(Resilient Distributed Dataset),是spark的编程模型,是MapReduce模型的扩展和延伸,可以在并行计算阶段高效地进行数据共享。
RDD基础
RDD类型
RDD主要分为以下四种类型:
- 创建操作:用于RDD创建工作。主要有两种方法:来自于内存集合和外部存储系统;通过转换操作生成的RDD。
- 转换操作:将RDD通过一定的操作变换成新的RDD。
- 控制操作:进行RDD持久化。让RDD根据不同的存储策略保存在内存或者磁盘中。
- 行动操作:能够触发
spark运行的操作。spark中行动操作分为两类:一类的操作结果变成scala集合或变量,另一类的操作是将RDD保存到外部文件系统或者数据库中。
创建RDD
- 并行化集合创建操作
使用
SparkContext的parallelize方法,在一个已经存在的scala集合上创建。集合的对象将会被复制,创建出一个可以被并行操作的分布式数据集。

- 外部存储创建操作
spark可以将任何Hadoop所支持的存储资源转换成RDD。

RDD依赖关系
主要分为窄依赖和宽依赖:
- 窄依赖:每个父RDD的分区都至多被一个子RDD的分区使用。
- 宽依赖:多个子RDD的分区依赖一个父RDD的分区。
读取文件

wordmap的依赖关系是OneToOneDependency,属于窄依赖

使用reduceByKey操作对单词进行计数

wordreduce的依赖关系是ShuffleDependency,属于宽依赖

RDD的分区数
RDD划分很多的分区(partition)分布到集群的节点中,分区的多少涉及对这个RDD进行并行计算的粒度。分区是个逻辑概念。用户可以在读取文件时指定分区数目。默认数值是改程序所分配到的CPU核数,如果从HDFS进行创建,则默认为文件的副本数。
RDD分区计算(Iterator)
spark中RDD计算是以分区为单位的,而且计算函数都是对迭代器复合,不需要保存每次计算的结果。分区计算一般使用mapPartitions等操作进行。1
def mapPartitions[U: ClassTag](f: Iterator[T] => Iterator[U], preservesPartitioning: Boolean = false): RDD[U]
f为输入函数,处理每个分区里面的内容。
函数
iterfunc把分区中一个元素和他的下个元素组成一个Turple
RDD分区函数(Partitioner)
spark默认提供两种划分器:哈希分区划分器(HashPartitioner)和范围分区划分器(RangePartitioner),且Partitioner只存在(K, V)类型的RDD中,对于非(K, V)类型的RDD,其Partitioner值为None。
参数4是
group_rdd最终拥有的分区数
RDD基本转换操作
map:
flatMap:
distinct:
coalesce:对RDD重新分区。第一个参数是重分区的数目,第二个参数为是否进行shuffle,默认为false。如果重分区的数目大于原分区,则需要设为True。
repartition:是coalesce第二个参数为True时的实现。randomSplit:

union:结果不去重。
mapPartitionsmapPartitionsWithIndexzip:将两个同样分区RDD进行合并,键值分别对照组合。分区不同的两个RDD会报异常。
RDD键值转换操作
reduceByKey:将RDD[K, V]中每个K对应的V根据映射函数进行计算。

reduceByKeyLocally:同reduceByKey,不过是将结果映射到一个Map[K, V]中。join、fullOuterJoin、leftOuterJoin、rightOuterJoin:join内连接操作:

leftOuterJoin左连接操作:

rightOuterJoin右连接操作:

RDD行动操作
aggregate:
进行
aggregate操作:
先在每个分区中迭代执行(x:Int, y:Int) => x + y,并且zeroValue为1,即分区1中为1+5+4+3+2+1=16,分区2中为1+10+9+8+7+6=41
再将两个分区进行合并,1+16+41=58
总结
本文主要对RDD的四种操作进行了简单汇总,后续将对一些操作函数进行扩充完善。

