spark自定义分区的实现

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){

猜你喜欢

转载自blog.csdn.net/xianpanjia4616/article/details/88738091