Spark随笔--核心数据结构RDD

概念
  • 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值