package date_20250415

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

/** Spark求学生成绩Top N程序 */
object RDDGroupTopN {

    def main(args: Array[String]): Unit = {

        // 创建SparkConf对象，存储应用程序的配置信息
        val conf: SparkConf = new SparkConf()
          .setMaster("local") // 启动本地化计算
          .setAppName("Spark-GroupTopN") // 设置应用程序名称

        // 创建SparkContext对象
        val sc = new SparkContext(conf)

        // 读取指定路径中的文件内容，生成一个RDD集合
        val linesRDD: RDD[String] = sc.textFile("hdfs://hadoop102:8020/input/data/score.txt")

        // 将每一行数据转化为 (姓名, 成绩) 二元组
        val tupleRDD: RDD[(String, Int)] = linesRDD.map(line => {
            val Array(name, score) = line.split(",")
            (name, score.toInt)
        })

        // 对每个学生分数进行分组，排序后取前3个成绩
        val top3: RDD[(String, List[Int])] = tupleRDD.groupByKey().map { case (name, scores) =>
            val scoreTop3: List[Int] = scores.toList.sortWith(_ > _).take(3)
            (name, scoreTop3)
        }

        // 对姓名进行排序并输出结果
        val sortedTop3: RDD[(String, List[Int])] = top3.sortBy(_._1) // 按名字进行排序

        // 保存结果到HDFS
        sortedTop3.collect().foreach(
            x => {
                println("姓名：" + x._1)
                x._2.foreach(
                    y => {
                        println("成绩：" + y)
                    }
                )
                println("*" * 20)
            }
        )

        sortedTop3.saveAsTextFile("hdfs://hadoop102:8020/output/result9")

        // 停止SparkContext
        sc.stop()
    }
}