不多说,直接上干货!
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 }