Spark RDD实现分组求TopN
有以下学生成绩数据:
Andy,98
Jack,87
Bill,99
Andy,78
Jack,85
Bill,86
Andy,90
Jack,88
Bill,76
Andy,58
Jack,67
Bill,79
同一个学生有多门成绩,现需要计算每个学生分数最高的前3个成绩,期望的输出结果如下:
姓名:Andy
成绩:98
成绩:90
成绩:78
*******************
姓名:Bill
成绩:99
成绩:86
成绩:79
*******************
姓名:Jack
成绩:88
成绩:87
成绩:85
*******************
项目实现:
package com.task.hotWord
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
/**
* 同一个学生有多门成绩,现需要计算每个学生分数最高的前3个成绩,期望的输出结果如下:
姓名:Andy
成绩:98
成绩:90
成绩:78
*******************
姓名:Bill
成绩:99
成绩:86
成绩:79
*******************
姓名:Jack
成绩:88
成绩:87
成绩:85
*******************
*/
object topN {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf()
.setAppName("分组top")
.setMaster("local[*]")
val sc = new SparkContext(conf)
val line: RDD[String] = sc.textFile("E:\\IdeaProject\\hadoop\\project\\src\\main\\java\\com\\task\\hotWord\\aa.txt")
// val line: RDD[String] = sc.textFile(args(0))
val value: RDD[(String, Int)] = line.map(l => {
val strings: Array[String] = l.split(",")
(strings.apply(0), strings.apply(1).toInt)
})
value.groupByKey()
.mapValues(_.toSeq.sortBy(-_).take(3))
.collect()
.foreach(m => {
val name: String = m._1
println(s"姓名:$name")
m._2.foreach(score =>
println(s"成绩:$score")
)
println("*******************")
}
)
sc.stop()
}
}
提交spark集群
/opt/apps/spark-3.2.3-bin-hadoop3.2/bin/spark-submit --master spark://linux01:7077 --executor-memory 1g --total-executor-cores 4 --class com.task.hotWord.hotWordCnt /root/SX_data/project-1.0-SNAPSHOT.jar hdfs://linux01:8020/SX_project/task_3/keywords.txt hdfs://linux01:8020/SX_project/task_3/out
/opt/apps/spark-3.2.3-bin-hadoop3.2/bin/spark-submit --master yarn --executor-memory 1g --total-executor-cores 4 --class com.task.hotWord.topN /root/SX_data/project-1.0-SNAPSHOT.jar hdfs://linux01:8020/SX_project/task_4/score.txt