1. 程式人生 > >SparkCore(13):TopN演算法

SparkCore(13):TopN演算法

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)方法一和方法二的區別是返回值是集合還是單個元組