SparkCore(13):TopN演算法
阿新 • • 發佈:2018-12-17
1.實現功能
針對資料,進行排序選取TopN的資料。
2.資料
aa 78
bb 98
aa 80
cc 98
aa 69
cc 87
bb 97
cc 86
aa 97
bb 78
bb 34
cc 85
bb 92
cc 72
bb 32
bb 23
3.程式碼
package _0722rdd import SparkUtil.SparkUtil import org.apache.spark.rdd.RDD /** * Created by Administrator on 2018/7/22. */ object GroupSortTopN { def main(args: Array[String]): Unit = { val sc = SparkUtil.createSparkContext(true,"GroupSortTopN") // linux上:val inputPathfile:///opt/datas/groupsort.txt val inputPath="datas/groupsort.txt" val rdd=sc.textFile(inputPath,1) val N=3 //方法一 /* (aa,List(78, 80, 97)) (bb,List(92, 97, 98)) (cc,List(86, 87, 98)) */ val resultRdd1: RDD[(String, List[Int])] =rdd.map(_.split(" ")) .filter(arr=>{ arr.length==2 }) .map(t=>(t(0),t(1).toInt)) .groupByKey() .map({ case(key,itr)=>{ //應該是asc (key,itr.toList.sorted.takeRight(N)) //下面的是降序排序*** // (key,itr.toList.sortWith((a,b)=>a>b).takeRight(N)) } }) resultRdd1.foreach(println) //方法二 /* (aa,78) (bb, 98) (cc,98) */ val resultRdd2=rdd.map(_.split(" ")) .filter(arr=>{ arr.length==2 }) .map(t=>(t(0),t(1).toInt)) .groupByKey() .flatMap({ case(key,itr)=>{ //應該是asc val ite=itr.toList.sorted.takeRight(3) ite.map(it=>(key,it)) } }) resultRdd2.foreach(println) } }
(1)按照降序排序的方法
(key,itr.toList.sortWith((a,b)=>a>b).takeRight(N))
(2)方法一和方法二的區別是返回值是集合還是單個元組