Spark之唯一键下TopN算法
简述
Spark中的TopN算法原理上与MapReduce的TopN算法是相同的,只不过是换成了特定的Spark操作而以。
输入数据
1,cat1,1
2,cat2,2
3,cat3,3
4,cat4,4
5,cat5,5
6,cat6,6
7,cat7,7
8,cat8,8
9,cat9,9
10,cat10,10
11,cat11,11
12,cat12,12
13,cat13,13
14,cat14,14
15,cat15,15
16,cat16,16
17,cat17,17
18,cat18,18
19,cat19,19
20,cat20,20
21,cat21,21
22,cat22,22
23,cat23,23
24,cat24,24
25,cat25,25
26,cat26,26
27,cat27,27
28,cat28,28
29,cat29,29
30,cat30,30
运行代码
package TopN
import org.apache.spark.{SparkConf, SparkContext}
import scala.collection.SortedMap
object TopN{
def main(args: Array[String]): Unit = {
//连接sparkMaster,初始化spark
val sparkConf=new SparkConf().setAppName("TopN").setMaster("local")
val sc=new SparkContext(sparkConf)
val N=sc.broadcast(10)
val input=sc.textFile("input/topN.txt")
val pair=input.map(line=>{
val tokens=line.split(",")
(tokens(2).toInt,tokens)
})
//类似于MapReduce中的setuo()和clearup()函数,相关变量和资源集中初始化
//为各个分区创建本地的topN列表
val partitions=pair.mapPartitions(itr=>{
var sortedMap=SortedMap.empty[Int,Array[String]]
itr.foreach{tuple=>
{
sortedMap+=tuple
if(sortedMap.size>N.value){
sortedMap=sortedMap.takeRight(N.value)
}
}
}
sortedMap.takeRight(N.value).toIterator
})
//创建最终的topN列表
val moreApproach=pair.groupByKey().sortByKey(false).take(N.value)
moreApproach.foreach{
case(k,v)=>println(s"$k \t ${v.flatten.mkString(",")}")
}
sc.stop()
}
}