大数据——Spark RDD算子(十三)RDD分区HashPartitioner、RangePartitioner、自定义分区

Spark RDD算子(十三)RDD分区HashPartitioner、RangePartitioner、自定义分区

HashPartitioner

  • 默认分区就是HashPartitioner
package nj.zb.sparkstu

import org.apache.spark.rdd.RDD
import org.apache.spark.{HashPartitioner, SparkConf, SparkContext}

object HashPartitioner {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("HashPartitioner")
    val sc: SparkContext = new SparkContext(conf)
    val rdd1: RDD[(Int, Int)] = sc.parallelize(List((1,1),(1,2),(2,3),(2,4),(3,5),(3,6),(4,7),(4,8),(5,9),(5,10)))

    //未分区输出
    rdd1.foreachPartition(partition=>println(partition.length))
    println("-----------------------------")
    val rdd2 = rdd1.partitionBy(new HashPartitioner(3))

    //分区输出
    rdd2.foreachPartition(partition=>println(partition.length))
  }
}

结果展示:
在这里插入图片描述

RangePartitioner

  • 使用一个范围,将范围内的键分配给相应的分区。这种方法适用于键中有自然排序,键不为负
package nj.zb.sparkstu

import org.apache.spark.rdd.RDD
import org.apache.spark.{RangePartitioner, SparkConf, SparkContext}

object RangePartitioner {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RangePartitioner")
    val sc: SparkContext = new SparkContext(conf)
    val rdd1: RDD[(Int, Int)] = sc.parallelize(List((1,1), (5,10), (5,9), (2,4), (3,5), (3,6),(4,7), (4,8),(2,3), (1,2)))

    rdd1.foreachPartition(x=>println(x.length))
    println("---------------------------")
    val rdd2: RDD[(Int, Int)] = rdd1.partitionBy(new RangePartitioner(3,rdd1))
    rdd2.foreachPartition(x=>println(x.length))
  }
}

结果展示:在这里插入图片描述

自定义分区

package nj.zb.sparkstu

import org.apache.spark.rdd.RDD
import org.apache.spark.{Partitioner, SparkConf, SparkContext}

class zidingyi(numParts:Int) extends Partitioner {
  override def numPartitions: Int = numParts

  override def getPartition(key: Any): Int = {
    if (key.toString.toInt >= 4) {
      0
    } else if (key.toString.toInt >= 2 && key.toString.toInt < 4) {
      1
    } else {
      2
    }
  }
}

object zidingyi{
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("zidignyi")
    val sc: SparkContext = new SparkContext(conf)
    val rdd1: RDD[(Int, Int)] = sc.parallelize(List((1,1), (5,10), (5,9), (2,4), (3,5), (3,6),(4,7), (4,8),(2,3), (1,2)))
    val rdd2: RDD[(Int, Int)] = rdd1.partitionBy(new zidingyi(3))
    rdd2.foreachPartition(x=>println(x.length))
  }
}

结果展示:在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值