6.2.产生shuffle的transformation的算子
Transformation算子只要产生shuffle就会写入磁盘,而且会触动行动算子,分布聚合都是在shuffle之前,然后开始写入磁盘,全局聚合,是shuffle之后,是从本地磁盘中拉去出来,比如reduceByKey
6.2.1 sortBy 和sortByKey 排序
使用的RangePartition,在构建这个分区器是要采样,触发一次Action
//sortby 参数一排序规则 参数二 默认升序 false 降序
sc.parallelize(List(5,11,22,13,2,1,10)).sortBy(x=>x,true)
// 默认是升序 false 降序
val rdd1 = sc.parallelize(List((“hello”, 9), (“tom”, 8), (“kitty”, 7), (“tom”, 2)))
val rdd2 = rdd1.sortByKey()
6.2.2. groupBy 和groupByKey 按照key进行分组
底层调用的是combineByKeyWithClassTag
groupBy
val rdd1 = sc.parallelize(List((“hello”, 9), (“tom”, 8), (“kitty”, 7), (“tom”, 2)))
val rdd2 = rdd1.groupBy(.1)
groutpByKey
在一个PairRDD或(k,v)RDD上调用,返回一个(k,Iterable)。主要作用是将相同的所有的键值对分组到一个集合序列当中,其顺序是不确定的。groupByKey是把所有的键值对集合都加载到内存中存储计算,若一个键对应值太多,则易导致内存溢出。
def main(args: Array[String]): Unit = {
val sc: SparkContext = SparkUtil.getSparkContext()
val rdd1: RDD[String] = sc.textFile(“d://word.txt”)
// 处理的是切割好的所有的单词
val rdd2: RDD[String] = rdd1.flatMap(.split("\s+"))
// 组装成(单词 , 1)
val rdd3: RDD[(String, Int)] = rdd2.map((,1))
// 按照相同的key分到一起 迭代器中存储是所有的单词
val rdd4: RDD[(String, Iterable[Int])] = rdd3.groupByKey()
val rdd5: RDD[(String, Int)] = rdd4.map(x=>(x._1,x._2.toList.size))
rdd5.collect().foreach(println)
sc.stop()
}
统计出文本中每个单词的个数
)
6.2.3 ****reduceByKey
可以先局部聚合,在全局聚合,底层调用的是combineByKeyWithClassTag
与groupByKey类似,却有不同。如(a,1), (a,2), (b,1), (b,2)。groupByKey产生中间结果为( (a,1), (a,2) ), ( (b,1), (b,2) )。而reduceByKey为(a,3), (b,3)。
reduceByKey主要作用是聚合,groupByKey主要作用是分组。(function对于key值来进行聚合)
def main(args: Array[String]): Unit = {
val sc: SparkContext = SparkUtil.getSparkContext()
val rdd1: RDD[String] = sc.textFile(“d://word.txt”)
// 处