17.11 算子(分区)⭐️
17.11.1 转换算子
-
mapPartitionsWithIndex
- 类似于mapPartitions,除此之外还会携带分区的索引值
-
repartition
- 增加或减少分区。此算子会产生 shuffle
-
coalesce
- coalesce 常用来减少分区,算子中第二个参数是减少分区的过程中是否产生 shuffle 。
- true 为产生 shuffle , false 不产生 shuffle 。默认是 false 。
- 如果 coalesce 设置的分区数比原来的 RDD 的分区数还多的话,第二个参数设置为 false 不会起作用(转换之后分区数大于之前),如果设置成 true ,效果和 repartition 一样。
repartition(numPartitions) = coalesce(numPartitions,true)
-
groupByKey
- 作用在 K,V 格式的 RDD 上。根据 Key 进行分组。作用在 (K,V) ,返回
(KIterable<V>)
- groupByKey 和 reduceByKey 区别
- reduceByKey 是一个分组聚合类算子,在 Map 端默认开启聚合,且聚合逻辑必须与 Reduce 端一致,即由传进来聚合函数 f 指定;
- groupByKey 是一个分组收集类算子,在 Map 端不会产生 combine() ,只是把相同的 key 的数据进行收集到一起,不会接收类似 f 的函数形参
- 作用在 K,V 格式的 RDD 上。根据 Key 进行分组。作用在 (K,V) ,返回
-
zip
- 将两个 RDD 中的元素( KV格式/非KV格式 )变成一个 KV 格式的 RDD ,两个 RDD 的个数必须相同,同时分区数也必须相同。
-
zipWithIndex
- 该函数将 RDD 中的元素和这个元素在 RDD 中的索引号(从0开始)组合成 (K,V) 对
17.11.2 行动算子
- countByKey
- 作用到 K,V 格式的 RDD 上,根据 Key 计数相同 Key 的数据集元素。
- countByValue
- 根据数据集每个元素相同的内容来计数。返回相同内容的元素对应的条数。
- reduce
- 根据聚合逻辑聚合数据集中的每个元素
17.12 案例解答⭐️
17.12.1 PV&UV
17.12.2 二次排序
17.12.3 分组取topN
17.13 广播变量和累加器⭐️
17.13.1 广播变量
图解:
-
广播变量的使用
val conf = new SparkConf() conf.setMaster("local").setAppName("brocast") val sc = new SparkContext(conf) val list = List("hello yjx") val broadCast = sc.broadcast(list) val lineRDD = sc.textFile("./words.txt") lineRDD.filter { x => broadCast.value.contains(x) }.foreach {println} sc.stop()
-
注意事项
- 广播变量只能在 Driver 端定义,不能在 Executor 端定义。
- 在 Driver 端可以修改广播变量的值,在 Executor 端无法修改广播变量的值
17.13.2 累加器
图解:
-
累加器的使用
val conf = new SparkConf() conf.setMaster("local").setAppName("accumulator") val sc = new SparkContext(conf) val accumulator = sc.longAccumulator sc.textFile("./words.txt").foreach { x =>{accumulator.add(1)}} println(accumulator.value) sc.stop()
-
注意事项
- 累加器在Driver端定义赋初始值,累加器只能在Driver端读取,在Executor端更新