RDD
RDD的概念
RDD(resilient distributed dataset)是什么?
- RDD是弹性分布式数据集
- 是spark对数据的抽象
- spark的本质就是对RDD的创建、转化、处理
RDD的属性
一组分片(Partition),即数据集的基本组成单位,对于RDD来说,每个分片都会被一个计算任务处理,用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值,默认值一般就是程序所分配到的CPU Core的数目。
一个计算每个分区的函数,Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的,compute函数会对迭代器进行复合,不需要保存每次计算的结果。
RDD之间的依赖关系,RDD的每次转换都会生成一个新的RDD,所以RDD之间就会形成类似于流水线一样的前后依赖关系,在部分分区数据丢失时,Spark可以通过这个依赖关系重新计算丢失的分区数据,而不是对RDD的所有分区进行重新计算。
一个列表,存储存取每个Partition的优先位置(preferred location),对于一个HDFS文件来说,这个列表保存的就是每个Partition所在的块的位置,按照“移动数据不如移动计算”的理念,Spark在进行任务调度的时候,会尽可能地将计算任务分配到其所要处理数据块的存储位置。
创建RDD
创建RDD有三种创建方法:
- 从集合创建:
val lines1=sc.parallelize(List(“aa”,”bb”)) - 从文件中创建,本地文件:
val lines2=sc.textFile(“/root/wc.txt”) - 从文件创建,hdfs:
val lines2=sc.textFile(“hdfs://hadoop3801:9000/文件名”)
RDD的转化操作
RDD支持两种操作:
- 转化操作(transformations算子,并没有触发执行)
- 行动操作(action算子,触发执行)
RDD的算子(函数、方法)
transformations算子:
相当于scala的lazy, 延迟加载,不会将操作递交到集群,主要常用的包括:map,flatMap,filter,union,distinct,groupBy,sortBy
Map: 返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成。
flatMap: 压平操作。
filter: 过滤(返回一个新的RDD,该RDD由func函数计算后返回值为true的输入元素组成)。
union: 并集(两个RDD求并集后返回一个新的RDD)。
distinct: 去重(对原RDD进行去重后返回一个新的RDD)。
intersection: 交集(两个RDD求交集后返回一个新的RDD)。
groupBy: 分组
sortBy: 排序
action算子:真正触发执行
collect: 收集,将数据收集到Driver端。
count: 计数。
take: 求集合中的n个元素。
foreach: 对原来的RDD中的每个元素,执行func操作 。
foreach和map的区别:
(1): foreach没有返回值,map有返回值
(2): foreach是action操作,会触发计算,map是tranformation操作,延迟计算