package date_20250415

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

/** Spark求学生最低2个成绩程序 */
object RDDLowest2Scores {

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

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

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

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

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

        // 对每个学生分数进行分组，排序后取最低的前2个成绩
        val sortedLowest2: RDD[(String, List[Int])] = tupleRDD
          .groupByKey()
          .map { case (x, y) =>
              val lastTop2: List[Int] = y.toList.sortWith(_ < _).take(2)
              (x, lastTop2)
          }
          .sortBy(_._1)

        sortedLowest2
          .collect()
          .foreach(
              x => {
                  println("姓名：" + x._1)
                  x._2.foreach(
                      y => {
                          println("成绩：" + y)
                      }
                  )
                  println("*" * 20)
              }
          )

        // 保存结果到HDFS
        sortedLowest2.saveAsTextFile("hdfs://hadoop102:8020/output/lowest2Scores")

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