1、对于第一个求topN代码如下:
原始数据
/**
* 对文本文件内的数字,取最大的前3个
*/
object TopN {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("TopN").setMaster("local")
val sc = new SparkContext(conf)
val rdd: RDD[String] = sc.textFile("F:\\Program Files\\feiq\\Recv Files\\scala\\day08-spark\\day08\\工具\\top.txt")
val ss: Array[String] = rdd.collect()
//val broad = sc.broadcast(rdd)
val maps: RDD[(Integer, String)] = rdd.map(t=>{
(Integer.valueOf(t),t)
})
val tuples = maps.sortByKey(false).take(3)
tuples.foreach(t=>println(t._2))
sc.stop()
}
}
执行结果:
2、分组求topN算法,
先看一下数据
要求找出 相同class的成绩前3名
实现代码如下:
/**
* 分组取TopN
*/
object GroupTopN {
def main(args: Array[String]): Unit = {
//创建配置对象
val conf = new SparkConf().setAppName("GTopN").setMaster("local")
val sc = new SparkContext(conf)
//获取数据
val rdd = sc.textFile("F:\\Program Files\\feiq\\Recv Files\\scala\\day08-spark\\day08\\工具\\score.txt")
//将每行数据 转换成元组形式(a,b)
val tuple1: RDD[(String, String)] = rdd.map(t=>{
val str = t.split(" ")
val banji = str(0)
val score = str(1)
(banji,score)
})
//进行分组
val grouped: RDD[(String, Iterable[String])] = tuple1.groupByKey()
//对每一组的数据 value值是一个集合,toArray转化成数组,使用sortwith方法 从大到小排序,然后求take3
val topN: RDD[(String, Array[String])] =grouped.map(t=>{
val group = t._1
val list: Array[String] = t._2.toArray.sortWith(_>_).take(3)
(group,list)
})
//由于spark需要一个action算子来触发代码的执行,所以这里打印一下
topN.foreach(t=>{
println(t._1)
t._2.foreach(println)
println("--------------")
})
}
}