spark默认是提供了两种分区器,HashPartitioner和RangePartitioner,但是有的时候不能满足我们实际的需求,这个时候我们可以自定义一个分区器,也非常的简单.看下面一个demo,把key是偶数的放到一个分区,key是奇数的放到另一个分区.
package spark
import org.apache.spark.{Partitioner, SparkConf, SparkContext, TaskContext}
/**
* spark自定义分区
*/
object CoustomPartitioner {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("Spark Streaming Jason").setMaster("local")
val sc = new SparkContext(conf)
val rdd = sc.parallelize(1 to 10,5)
rdd.map((_,1)).partitionBy(new MyPartitioner(2)).foreachPartition(fp=>{
println("分区ID:" + TaskContext.get.partitionId)
fp.foreach(f=>{
println(f)
})
})
}
}
class MyPartitioner(num:Int) extends Partitioner {
override def numPartitions: Int = num
override def getPartition(key: Any): Int = {
if(key.toString.toInt % 2 == 0){
0
}else{
1
}
}
}
执行上面的代码,打印的结果如下:
分区ID:0
(2,1)
(4,1)
(6,1)
(8,1)
(10,1)
分区ID:1
(1,1)
(3,1)
(5,1)
(7,1)
(9,1)
Process finished with exit code 0
可以看到2,4,6,8,10都在分区0. 1,3,5,7,9,都在分区1中.
如果有写的不对的地方,欢迎大家指正,如果有什么疑问,可以加QQ群:340297350,更多的Flink和spark的干货可以加入下面的星球