概念
- RDD(弹性分布式数据集),可以看作是一种集合类型(Array,List),可以通过RDD来操作和存储数据;
- 但是与普通的集合是有区别的:
- ①RDD有分区机制,可以分布式的进行数据集的处理,从而提高处理速度
- ②RDD有容错机制,数据丢失可以恢复
-
如何创建RDD
- 方式一:将普通集合(Array,List)转化为RDD
- ①sc.makeRDD(普通集合,分区数) 例如:sc.makeRDD(List(1,2,3,4),3)
- ②sc.parallelize(普通集合,分区数)
- 方式二:通过读取外部存储的文件系统,例如本地,HDFS将一个文件封装成一个RDD
- 读取本地文件:sc.textFile(“file:///home/word.txt”,2) 对数据进行均匀分配到分区中
-
- 读取HDFS文件:sc.textFile(“hdfs://hadoop02:9000/word.txt”,3)
- 其中sc为Spark Context 上下文对象,可以通过此对象操作Spark环境,以及创建RDD
- 启动页 信息包括 web访问地址…
-
小结
RDD是最核心的数据结构,分区,容错机制。如果数据很大,可以增加分区数来提高并行度,提高处理效率; 凡是通过Spark处理数据,都必须将数据转化为一个RDD再进行处理
对RDD的操作
- ① Transformation 变换操作;是懒加载
- ② Action 执行操作
- ③ Controller 控制操作
方法总结
操作集合的方法RDD同样适用
此外还有
懒方法补充
- mapPartitions – 与map类似,只不过映射函数的参数由RDD中的每一个元素变成了RDD中每一个分区的迭代器。
/*
计算每个分区的和
*/
val rs1=r1.mapPartitions{it=> //此处的it是一个迭代器
val result=List[Int]()//将返回的结果放入一个集合中
var sum=0
while(it.hasNext){
sum=sum+it.next
}
result.::(sum).iterator //必须以迭代器的形式返回
- mapPartitionsWithIndex:函数作用同mapPartitions,不过提供了两个参数,第一个参数为分区的索引
val rs2=r1.mapPartitionsWithIndex{(index,it)=>
val result=List[String]()//可以把编号添上
var sum = 0
while(it.hasNext){
sum=sum+it.next
}
result.::(index+"|"+sum).iterator
}
- groupByKey([numTasks]) :groupByKey对具有相同键的值进行分组; 按照元素第一个参数进行分组,按照groupByKey对于数据格式是有要求的,即操作的元素必须是一个二元tuple
tuple._1 是key, tuple._2是value
比较groupBy
- reduceByKey(func,[numTasks])😗*合并具有相同键的值,**和reduce相同的是它们都接收一个函数,并使用该函数对值进行合并;数据格式必须是一个二元tuple
- sortByKey([ascending],[numTasks]) :d2.sortByKey(true).collect 按照元组(._1)排序
- coalesce(numPatitions):coalesce(n,true/false) 扩大或缩小分区
案例展示:
val rdd = sc.makeRDD(List(1,2,3,4,5),2)
rdd.coalesce(3,true);//如果是扩大分区 需要传入一个true 表示要重新shuffle
rdd.coalesce(2);//如果是缩小分区 默认就是false 不需要明确的传入
执行方法补充
- takeOrdered(n,[ordering]) takeOrdered(n) 先将rdd中的数据进行升序排序 然后取前n个
- saveAsTextFile(path):saveAsTextFile 按照文本方式保存分区数据
- top(n):现将RDD中的数据进行降序排序,然后再取前n个
例: top(3)(Ordering.by{x=>x._2}按照 元组中第二个元素进行降序排序区前三个 - foreach(func)