所以:
object MapPartitionScala {def main(args: Array[String]): Unit = {val conf = new SparkConf()conf.setAppName("CheckpointOpScala").setMaster("local")val sc = new SparkContext(conf)//设置分区数量为2val dataRdd = sc.parallelize(Array(1,2,3,4,5),2)
// val sum =dataRdd.map(item=>{
// println("=======")
// item*2
// }).reduce(_+_)//mapParition一次处理一个分区的数据val sum = dataRdd.mapPartitions(it=>{println("=======")val result = new ArrayBuffer[Int]()it.foreach(item=>{result.+=(item*2)})result.toIterator}).reduce(_+_)print("sum:"+sum)sc.stop()}
}
foreach:一次处理一条数据
foreachPartition:一次处理一个分区的数据
foreachPartition的特性和mapPartitions 的特性是一样的,唯一的区别就是
mapPartitions 是 transformation 操作(不会立即执行),foreachPartition是 action 操作(会立即执行)
代码实现:
object ForeachPartitionOpScala {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setAppName("ForeachPartitionOpScala")
.setMaster("local")
val sc = new SparkContext(conf)
//设置分区数量为2
val dataRDD = sc.parallelize(Array(1,2,3,4,5),2)
//foreachPartition:一次处理一个分区的数据,作用和mapPartitions类似
//唯一的区是mapPartitions是transformation算子,foreachPartition是action算子
dataRDD.foreachPartition(it=>{
//在此处获取数据库链接
println("===============")
it.foreach(item=>{
//在这里使用数据库链接
println(item)
})
//关闭数据库链接
})
sc.stop()
}
}
对RDD进行重分区,repartition主要有两个应用场景:
代码实现:Repatition的使用
object RepartitionOpScala {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setAppName("RepartitionOpScala")
.setMaster("local")
val sc = new SparkContext(conf)
//设置分区数量为2
val dataRDD = sc.parallelize(Array(1,2,3,4,5),2)
//重新设置RDD的分区数量为3,这个操作会产生shuffle
//也可以解决RDD中数据倾斜的问题
dataRDD.repartition(3)
.foreachPartition(it=>{
println("=========")
it.foreach(println(_))
})
//通过repartition可以控制输出数据产生的文件个数
dataRDD.saveAsTextFile("hdfs://bigdata01:9000/rep-001")
dataRDD.repartition(1).saveAsTextFile("hdfs://bigdata01:9000/rep-002")
sc.stop()
}
}
功能:实现分组聚合
原理
首先这两个算子在执行的时候都会产生shuffle
但是:
1:当采用reduceByKey时,数据在进行shuffle之前会先进行局部聚合
2:当使用groupByKey时,数据在shuffle之间不会进行局部聚合,会原样进行shuffle
这样的话reduceByKey就减少了shuffle的数据传送,所以效率会高一些。
总结 :能用reduceByKey优先使用reduceByKey