分区原则
RDD分区的一个原则是使得分区的个数尽量等于集群中的CPU核心
对于不同的Spark部署模式而言(本地模式、Standalone模式、YARN模式、Mesos模式),都可以通过设置spark.default.parallelism这个参数的值,来配置默认的分区数目,一般而言:
本地模式默认为本地机器的CPU数目,若设置了local[N],则默认为N
依赖
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
代码题目
根据key值的最后一位数字,写到不同的文件
例如:
10写入到part-00000
11写入到part-00001
.
.
.
19写入到part-00009
代码
Partitioner:分区类需要实现的类
numPartitions:重写的参数为传入的分区数
getPartition:传入的参数为调用的方法的map的key(代码中无法看出,底层调用),返回值为分区的编号,要求0开始。即数量值比设置的分区数要少一个。
package com.uu.one
import org.apache.spark.{Partitioner, SparkConf, SparkContext}
//自定义分区类,需要继承org.apache.spark.Partitioner类
class MyPartitioner(numParts:Int) extends Partitioner{
override def numPartitions: Int = numParts
// getPartition(key: Any): Int:返回给定键的分区编号(0到numPartitions-1)。
override def getPartition(key: Any): Int = {
key.toString.toInt
}
}
object TestPartitioner {
def main(args: Array[String]) {
val conf=new SparkConf().setAppName("jj").setMaster("local")
val sc=new SparkContext(conf)
//模拟5个分区的数据
val data=sc.parallelize(1 to 10,5)
// data.foreach(x=>print("data的值为"+x+"_"))
data.map((_,1)).foreach(x=>print("data的值为"+x+"_"))
//根据尾号转变为10个分区,分别写到10个文件
data.map((_,1)).partitionBy(new MyPartitioner(11)).map(_._1).foreach(x=>println(x+"__"))
}
}