package date_20250408

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

/** Spark单词计数程序* */
object WordCountHdfsFile {
    
    def main(args: Array[String]): Unit = {
        System.setProperty("HADOOP_USER_NAME", "root")
        //创建SparkConf对象，存储应用程序的配置信息
        val conf = new SparkConf().setMaster("local")
          //启动本地化计算，默认1个CPU核数
                                  .setAppName("Spark-WordCount")
        //创建SparkContext对象,该对象是提交Spark应用程序的入口
        val sc = new SparkContext(conf);
        //读取指定路径(取程序执行时传入的第一个参数)中的文件内容，生成一个RDD集合
        //val linesRDD: RDD[String] = sc.textFile(args(0))
        val linesRDD: RDD[String] = sc.textFile("hdfs://hadoop102:8020/input/wordcount2.txt")
        //将RDD的每个元素按照空格进行拆分并将结果合并为一个新的RDD
        val wordsRDD: RDD[String] = linesRDD.flatMap(_.split(" "))
        //将RDD中的每个单词和数字1放到一个元组里，即(word,1)
        val paresRDD: RDD[(String, Int)] = wordsRDD.map((_, 1))
        //对单词根据key进行聚合，对相同的key进行value的累加
        val wordCountsRDD: RDD[(String, Int)] = paresRDD.reduceByKey(_ + _)
        //按照单词数量降序排列
        val wordCountsSortRDD: RDD[(String, Int)] = wordCountsRDD.sortBy(_._2, false) //保存结果到指定的路径(取程序执行时传入的第二个参数)
        //wordCountsSortRDD.saveAsTextFile(args(1))
        wordCountsSortRDD.saveAsTextFile("hdfs://hadoop102:8020/output/result1") //停止SparkContext，结束该任务
        sc.stop();
    }
}