我们希望每个学科能够分到一个分区,这样的话我们就需要先计算出一共有多少个学科,然后为每个学科赋予一个编号。我们这里的编号从0开始,如果出现没有对应编号的情况,则直接放到0区。这样的话我们还需要自定义分区器。
我们自定义分区器的话需要继承Partitioner并重写未实现的方法
第一个方法是说明有几个分区,第二个方法是根据传入的key决定该条数据到哪个分区。
定好分区规则之后,现在每个分区里只有一个学科,这样我们可以通过mapPartitions一下拿到一个分区。
为了让他按照学科分区,我们还需要将数据整理成学科为key的样子。
代码如下:
package com.test.day02
import java.net.URL
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
import org.apache.spark.Partitioner
import scala.collection.mutable
object FavTeacher2 {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new Spark