Top K Top K算法有两步,一是统计词频,二是找出词频最高的前K个词。 1.实例描述 假设取Top 1,则有如下输入和输出。 输入: Hello World Bye World Hello Hadoop Bye Hadoop Bye Hadoop Hello Hadoop 输出: 词Hadoop 词频4 2.设计思路 首先统计WordCount的词频,将数据转化为(词,词频)的数据对,第二个阶段采用分 治的思想,求出RDD每个分区的Top K,最后将每个分区的Top K结果合并以产生新的集 合,在集合中统计出Top K的结果。每个分区由于存储在单机的,所以可以采用单机求Top K的方式。本例采用堆的方式。也可以直接维护一个含K个元素的数组,感兴趣的读者可以 参考其他资料了解堆的实现。 3.代码示例 Top K算法示例代码如下: import org.apache.spark.SparkContext import org.apache.spark.SparkContext._ object TopK { def main(args:Array[String]) { /*执行WordCount,统计出最高频的词*/ val spark = new SparkContext("local", "TopK", System.getenv("SPARK_HOME"), SparkContext.jarOfClass(this.getClass)) val count = spark.textFile("data").flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _) /*统计RDD每个分区内的Top K查询*/ val topk = count.mapPartitions(iter => { while(iter.hasNext) { putToHeap(iter.next()) } getHeap().iterator } ).collect() /*将每个分区内统计出的TopK查询合并为一个新的集合,统计出TopK查询*/ val iter = topk.iterator while(iter.hasNext) { putToHeap(iter.next()) } val outiter=getHeap().iterator /*输出TopK的值*/ println("Topk 值 :") while(outiter.hasNext) { println("\n 词频:"+outiter.next()._1+" 词:"+outiter.next()._2) } spark.stop() } } def putToHeap(iter : (String, Int)) { /*数据加入含k个元素的堆中*/ …… } def getHeap(): Array[(String, Int)] = { /*获取含k个元素的堆中的元素*/ val a=new Array[(String, Int)]() …… } 4.应用场景 Top K的示例模型可以应用在求过去一段时间消费次数最多的消费者、访问最频繁的IP 地址和最近、更新、最频繁的微博等应用场景。
Spark 编程实战之经典算法TOP K
原创
©著作权归作者所有:来自51CTO博客作者闭关修炼ing的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:能拯救你的人也只能是自己
下一篇:java二分查找算法
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
《机器学习实战》之K-近邻算法
k-近邻算法属于机器学习算法中的监督学习内容,用于线性回归;
机器学习 python 数据 python实现 -
BFPRT算法(TOP-K问题)
一:背景介绍 在一大堆数中快速排
算法 c++ TOP-K BFPRT 中位数 -
豆瓣经典编程图书Top 10,你知道几本?
豆瓣热门编程图书Top 10,部分附 PDF 版本
公众号 计算机系统 c++ 设计模式 c语言