RDD五大特性
外部存储转换为RDD
val datas=sc.textfile("address")
val wordrdd=rdd.flatmap(_.split(""))
val kvRdd=wordrdd.map((_,1))
val wordcoutrdd=kvrdd.reducebykey(_+_)
wordcoutrdd.collect
...transform中lazy加载,不会执行,直到action操作后才执行
1 a list of partitions(一系列分区组成的)
2 每一个分区都有一个function进行转换
3 每个rdd都有对其他RDD的依赖
4 optionally,针对keyvalue形式的rdd可以指定分区,告诉它如何分片
5 optionally,处理RDD的每个分片,split数据在哪里,就去哪计算,移动计算
操作
- transformation
- 创建一个新的数据集
- lazy mode
- example: map flatmap filter groupbykey reducebykey sortbykey join union
- action
- 返回一个值给driverprogram:例如保存 saveastextfile("address")
- 缓存为后续执行节省时间 persistent() cache()
RDD依赖
- 窄依赖
- 子RDD的每个分区依赖于常数个父分区
- 输入输出一对一的算子,且结果RDD的分区结构不变
- 输入输出一对一,但结果的RDD分区结构发生了变化
- 从输入中选择部分元素的算子
- 宽依赖
- 子RDD的分区依赖于所有的父RDD纷分区
- 对单个RDD基于key进行重组和reduce
- 对两个RDD基于key进行join和重组
RDDshuffle
- 针对split重新调整分区的机制
- 发生调整分区的会有此过程
- jion操作、bykey操作
spark内核分析
- RDD object
- DAG scheduler
- spark 阶段划分:根据有没有shuffle
- task scheduler
- worker
案例
- sort
- sortbykey
- sortbyvalue
wordcount.map(x=>(x._2,x._1)).sortbykey(false).map(x=>(x._2,x._1)).collect(按照降序)
- top k
- wordcount.map(x=>(x._2,x._1)).sortbykey(false).map(x=>(x._2,x._1)).take(3)(取前三)
- group top key
- rdd.map(_.split(" ")).map(x=>(x(0),x(1))).grouByKey.map(x=>{val xx=x._1
val yy=x._2
(xx,yy.tolist.sorted.reverse.take(3)
)}).collect
//tolist实现将前面得到的是iterable
转变为list
默认是升序,加reverse成降序
网友评论