package date_20250415

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

/** Spark求学生低于60分的成绩程序 */
object RDDBelow60Scores {

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

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

        // 创建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)
        })

        // 过滤出每个学生低于60分的成绩
        val below60: RDD[(String, Iterable[Int])] = tupleRDD
          .filter(_._2 < 60)
          .groupByKey()

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


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

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

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