统计每个学科最受欢迎的老师前N名

本文介绍了使用java技术,结合Spark-Core工具,分析并找出各学科最受欢迎的教师前N名的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package day02

import java.net.URL

import org.apache.spark.rdd.RDD
import org.apache.spark.{Partitioner, SparkConf, SparkContext}

import scala.collection.mutable
/**
  * 统计每个学科最受欢迎的老师前N名
  *
  *利用TreeSet进行数据优化
  */
object SubjectAndTeacher04 {
  def main(args: Array[String]): Unit = {
    //定义分区的
    val topN=2
       //设置本地运行
    val conf =new SparkConf().setAppName("SubjectAndTeacher04").setMaster("local[*]")
        //初始化对象
    val sc =new SparkContext(conf)
        //从HDFS上读取数据
    val lines = sc.textFile("hdfs://hadoop01:9000/sparkTest")
    val subjectAndTeacher = lines.map(line => {
      val url = new URL(line)
      val subject = url.getHost.substring(0, url.getHost.indexOf("."))
      val teacher = url.getPath.substring(1)
      ((subject, teacher), 1)
    })
    //收集到所有的学科数据
    val subjects: Array[String] = subjectAndTeacher.map(_._1._1).distinct().collect()
    //自定义一个分区
    val subjectPartition = new SubjectPartition(subjects)
    //先进行局部聚合,再进行全局聚合
    val reduced: RDD[((String, String), Int)] = subjectAndTeacher.reduceByKey(subjectPartition,_+_)
    //将新分区后的数据进行排序处理
    reduced.foreachPartition(partition=>{
      //自定义一个排序规则
      val ts = new mutable.TreeSet[((String,String),Int)]()(new SubjectOrdering())
      //分区遍历
      partition.foreach(item=>{
        ts.add(item)
        if(ts.size>topN){
          ts.remove(ts.last)
         //ts = ts.dropRight(1)
        }
      })
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值