不多说,直接上干货!
Pair RDD的分区控制
Pair RDD的分区控制
(1) Spark 中所有的键值对RDD 都可以进行分区控制---自定义分区
(2)自定义分区的好处:
1) 避免数据倾斜
2) 控制task并行度
自定义分区方式
class DomainNamePartitioner(numParts: Int) extends Partitioner {
override def numPartitions: Int = numParts
override def getPartition(key: Any): Int = {
val domain = new Java.net.URL(key.toString).getHost()
val code = (domain.hashCode % numPartitions)
if(code < 0) {
code + numPartitions // 使其非负
}else{
code
}
}
// 用来让Spark区分分区函数对象的Java equals方法
override def equals(other: Any): Boolean = other match {
case dnp: DomainNamePartitioner =>
dnp.numPartitions == numPartitions
case _ =>
false
}