Spark分区器浅析

分区器作用:决定该数据在哪个分区

概览:

  1. 仅仅只有pairRDD才可能持有分区器,普通RDD的分区器为None
  2. 在分区器为None时RDD分区一般继承至父RDD分区
  3. 初始RDD分区数:
    • 由集合创建,RDD分区数为cores总数
    • 由本地文件创建,RDD分区数为本地文件分片数
    • 由HDFS文件创建,RDD分区数为block数

1、HashPartitioner

计算公式:x=key.hashcode%分区数,如果为正 x即该数据所在分区,如果为负 x+总分区数 即为当前key所在分区

触发情况:

reducebykey,groupbykey,join等算子会自动调用

通过Partitionby设置

2、RangePartitioner

原理:通过水塘抽样法确定key值分区后分区临界点,再划分

水塘抽样算法原理:https://www.cnblogs.com/strugglion/p/6424874.html

 

注意:采样中需要collect,所以会触发action

 

触发情况:sortbykey

3、自定义分区

基础Partitioner,设定分区数和分区方法

class MyPartitioner(n: Int) extends Partitioner{
    override def numPartitions: Int = n

    override def getPartition(key: Any): Int = {
        val k = key.toString.toInt
        k / 100
    }
}

 

posted @ 2021-08-23 15:40  梦里繁花  阅读(124)  评论(0编辑  收藏  举报