3.3 掌握RDD分区

一、RDD分区数量

(一)使用parallelize()方法创建RDD时的分区数量
1、指定分区数量
在这里插入图片描述
利用mapPartitionsWithIndex()函数实现带分区索引的映射
在这里插入图片描述
在这里插入图片描述
2、默认分区数量
先用spark-shell本地模式启动
在这里插入图片描述
由此可见,本地机器master的CPU核数为4
在这里插入图片描述
(二)使用textFile()方法创建RDD时的分区数量
1、指定最小分区数量
在这里插入图片描述
在这里插入图片描述
2、默认最小分区数量
在这里插入图片描述
二、自定义分区器
(一)提出问题
在有些情况下,使用Spark自带的分区器满足不了特定的需求。
(二)解决问题
1、准备数据文件
在这里插入图片描述
将数据文件上传到HDFS指定目录
在这里插入图片描述
2、新建科目分区器
在这里插入图片描述

package net.cxf.rdd.day04
import org.apache.spark.Partitioner
/**
 * 功能:科目分区器
 * 作者:cxf
 * 日期:2023年05月06日
 */
class SubjectPartitioner(partitions: Int) extends Partitioner {
  /**
   * @return 分区数量
   */
  override def numPartitions: Int = partitions

  /**
   * @param key(科目)
   * @return 分区索引
   */
  override def getPartition(key: Any): Int = {
    val partitionIndex = key.toString match {
      case "chinese" => 0
      case "math" => 1
      case "english" => 2
    }
    partitionIndex
  }
}


3、测试科目分区器
在这里插入图片描述

package net.cxf.rdd.day04
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
 * 功能:测试科目分区器
 * 作者:cxf
 * 日期:2023年05月06日
 */
object TestSubjectPartitioner {
  def main(args: Array[String]): Unit = {
    // 创建Spark配置对象
    val conf = new SparkConf()
      .setAppName("TestSubjectPartitioner") // 设置应用名称
      .setMaster("local[*]") // 设置主节点位置(本地调试)
    // 基于Spark配置对象创建Spark容器
    val sc = new SparkContext(conf)
    // 读取HDFS文件,生成RDD
    val lines = sc.textFile("hdfs://master:9000/partition/input/marks.txt")
    // 将每行数据映射成(科目,成绩)二元组
    val data: RDD[(String, Int)] = lines.map(line => {
      val fields = line.split(" ")
      (fields(0), fields(1).toInt) // (科目,成绩)
    })
    // 将数据按科目分区器重新分区
    val partitionData = data.partitionBy(new SubjectPartitioner(3))
    // 在控制台输出分区数据
    partitionData.collect.foreach(println)
    // 保存分区数据到HDFS指定目录
    partitionData.saveAsTextFile("hdfs://master:9000/partition/output")
  }
}

运行程序,查看结果
在这里插入图片描述
查看HDFS的结果文件
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值