产生shuffle的转换算子

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”)
// 处

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值