Scala之TopN

package com.uplooking.bigdata.core.p3
 
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
 
import scala.collection.mutable
 
/**
  * Scala版本的TopN
  */
object ScalaSparkTopNApp {
  def main(args: Array[String]): Unit = {
    if (args == null || args.length < 1) {
      System.err.println("Parameter Errors! Usage: <topNum[Integer]>")
      System.exit(-1)
    }
    val conf: SparkConf = new SparkConf
    conf.setAppName(classOf[JavaSparkTopNOps].getSimpleName)
    conf.setMaster("local")
    val sc: SparkContext = new SparkContext(conf)
    val toNBC = sc.broadcast(args(0).trim.toInt)
 
    val linesRDD: RDD[String] = sc.textFile("E:/test/spark/topn.txt")
    val pairRDD = linesRDD.map(line => {
      val splits: Array[String] = line.split(" ")
      val score: Int = Integer.valueOf(splits(1).trim)
      val className: String = splits(0).trim
      new Tuple2[String, Int](className, score)
    })
    val gbkRDD = pairRDD.groupByKey()
 
    val topNGBKRDD = gbkRDD.map(tuple => {
      val className = tuple._1
      val scores = tuple._2
      val ts = new mutable.TreeSet[Int]()(new Ordering[Int]{
        override def compare(x: Int, y: Int): Int = {
          y - x
        }
      })
      for(s <- scores) {
        ts.add(s)
        if(ts.size > toNBC.value) {
          val last = ts.last;
          ts.remove(last)
        }
      }
      new Tuple2[String, Iterable[Int]](className, ts)
    })
 
    topNGBKRDD.foreach(t => println(t._1 + "\t" + t._2))
    sc.stop()
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值