一、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的结果文件