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){
      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的乾貨可以加入下面的星球

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章