《深入理解Spark》Spark自定义分区器

package com.lyzx.reviewDay27

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

class T1 {
  /**
    * Spark自定义分区器
    * @param sc
    */
  def f1(sc:SparkContext):Unit ={
    val rdd = sc.parallelize(List(99,88,200,10,900,1000),2).map(x=>(x,x))

    rdd.mapPartitionsWithIndex((index,itr)=>{
      println("index:"+index)
      while(itr.hasNext){
        print("-"+itr.next())
      }
      itr
    }).collect()

    val partRdd = rdd.partitionBy(new MyPartitioner)
    partRdd.mapPartitionsWithIndex((index,itr)=>{
      println("index:"+index)
      while(itr.hasNext){
        print("="+itr.next())
      }
      itr
    }).collect()
  }
}


class MyPartitioner extends Partitioner{
  //分区的个数
  override def numPartitions: Int = 2

  /**
    * 获取分区的编号
    * @param key
    *      RDD所映射的键值对数据的键
    * @return
    *     分区编号:如果返回1就是第二个分区
    */
  override def getPartition(key: Any): Int = {
    val k = key.toString.toInt
    if(k > 100){
      return 1
    }else{
      return 0
    }
  }
}
object T1{
  def main(args: Array[String]): Unit = {
    val conf  = new SparkConf().setAppName("reviewDay27").setMaster("local")
    val sc = new SparkContext(conf)
    val t= new T1
    t.f1(sc)

    sc.stop()
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值