1.RDD-转换算子-partitionBy(前面有吸气,中间有等待):
partitionBy:
函数签名:
def partitionBy(partition:Partitioner):RDD[(K,V)]
函数说明:将数据按照指定Partitioner重新进行分区,Spark默认的分区器时HashPartitioner
package com.guizhou.bigdata.spark.core.worldcount.operator.transform
import org.apache.spark.rdd.RDD
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}
object Spark14_RDD_Operator_Transform {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sc = new SparkContext(sparkConf)
//TODO 算子 - (key-Value类型)
val rdd = sc.makeRDD(List(1,2,3,4),2)
val mapRDD:RDD[(Int,Int)] = rdd.map((_,1))
//RDD => PairRDDFunctions
//隐式转换(二次编译)
//partitionBy根据指定的分区规则对数据进行重分区
mapRDD.partitionBy(new HashPartitioner(2))
.saveAsTextFile("output")
sc.stop()
}
}
2.RDD-转换算子-partitionBy-思考的问题:
如果重分区的分区器和当前RDD的分区器一样怎么办?
- 两个分区器在一样的情况下,第二个分区器是完全没必要的。根据代码中的源码可以看出,第二个分区器是作为if条件来成立的。
Spark还有其他分区器吗?
- 能用的分区器只有HashPartitioner和RangPartitioner(排序)
如果想按照自己的方法进行数据分区怎么办?
- 可以完全模仿来进行分区
3.RDD-转换算子-reduceByKey:
函数签名:
def reduceByKey(func:(V,V)=>V):RDD[(K.V)]
def reduceByKey(func:(V,V)=>V,numPartitions:Int):RDD[(K,V)]
函数说明:可以将数据按照相同的Key对Value进行聚合
- reduceByKey:相同的Key的数据进行value数据的聚合操作
- scala语言中一般都是两两聚合,spark基于scala开发,所以它的聚合也是两两相乘
package com.guizhou.bigdata.spark.core.worldcount.operator.transform
import org.apache.spark.rdd.RDD
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}
object Spark15_RDD_Operator_Transform {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sc = new SparkContext(sparkConf)
//TODO 算子 - (key-Value类型)
val rdd = sc.makeRDD(List(
("a",1),("a",2),("a",3),("b",4)
))
//reduceByKey:相同的Key的数据进行value数据的聚合操作
//scala语言中一般都是两两聚合,spark基于scala开发,所以它的聚合也是两两相乘
// 【1,2,3】
// 【3,3】
// 【6】
val reduceRDD: RDD[(String,Int)] = rdd.reduceByKey( (x:Int,y:Int) => {x + y})
reduceRDD.collect().foreach(println)
sc.stop()
}
}