一、partitionBy算子
将数据按照指定 Partitioner 重新进行分区。Spark 默认的分区器是 HashPartitioner
例子:
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sc = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List(1, 2, 3, 4), 2)
val mapRDD = rdd.map((_, 1))
mapRDD.partitionBy(new HashPartitioner(2)).saveAsTextFile("output")
sc.stop()
}
二、reduceByKey算子
可以将数据按照相同的 Key 对 Value 进行聚合
reduceByKey的参数为Value的聚合方法
例子:
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sc = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List(("a", 1), ("a", 2), ("a", 3), ("b", 1)))
val reduceRDD: RDD[(String, Int)] = rdd.reduceByKey(_ + _)
reduceRDD.collect().foreach(println)
sc.stop()
}
三、groupByKey算子
将数据源的数据根据 key 对 value 进行分组
groupByKey将数据源中的数据,相同的Key数据分在一个组里,形成一个对偶元组,元组中的第一个元素就是Key,元组中第二个元素就是相同的Key的Value集合
例子:
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sc = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List(("a", 1), ("a", 2), ("a", 3), ("b", 1)))
val groupRDD: RDD[(String, Iterable[Int])] = rdd.groupByKey()
groupRDD.collect().foreach(println)
sc.stop()
}
四、aggregateByKey算子
将数据根据不同的规则进行分区内计算和分区间计算
aggregateByKey存在函数柯里化,有两个参数列表
第一个参数列表,需要传递一个参数,表示初始值
主要用于当碰见第一个Key的时候,和Value进行分区内计算
第二个参数列表需要传递两个参数,第一个表示分区内计算规则,第二个表示分区间计算规则
aggregateByKey最终的返回类型应该和初始值的类型保持一致
例子:
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sc = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List(("a", 1), ("a", 2), ("a", 3), ("a", 1)), 2)
val aggregateRDD: RDD[(String, Int)] = rdd.aggregateByKey(0)((x, y) => math.max(x, y), _ + _)
aggregateRDD.collect().foreach(println)
sc.stop()
}
五、foldByKey算子
当分区内计算规则和分区间计算规则相同时,aggregateByKey 就可以简化为 foldByKey
如果聚合计算时,分区内核分区间的计算规则相同时,可以使用foldByKey
第一个参数列表,需要传递一个参数,表示初始值
主要用于当碰见第一个Key的时候,和Value进行分区内计算
第二个参数列表需要传递一个参数,表示分区内计算规则和分区间计算规则
例子:
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
val sc = new SparkContext(sparkConf)
val rdd = sc.makeRDD(List(("a", 1), ("a", 2), ("a", 3), ("a", 1)), 2)
val foldRDD: RDD[(String, Int)] = rdd.foldByKey(0)(_ + _)
foldRDD.collect().foreach(println)
sc.stop()
}