1.scala实现:

/*** TOPN:维持一个定长数组,先塞满,然后把剩下的逐个对应数组中的元素,* 有大的就把小的弹出去,大的加进来,并移动位置来重新排序*/
object TopN {def main(args: Array[String]): Unit = {val session = SparkSession.builder().master("local").appName("topn").getOrCreate()val sc = session.sparkContextval lines = sc.textFile("data/scores")val pairInfo = lines.map(one=>{(one.split(" ")(0),one.split(" ")(1).toInt)})pairInfo.groupByKey().map(tp=>{val className = tp._1val iterator = tp._2.iteratorval top3 = new Array[Int](3)//定长val loop = new Breaks//相当于java中的breakwhile (iterator.hasNext){val currentOne = iterator.next()loop.breakable{ //里面break,就回到这//整个过程都将围绕着这个长度为3的定长数组展开for (i<-0 until top3.size){//先把定长数组塞满if (top3(i)==0){top3(i)=currentOneloop.break()}else if(currentOne>top3(i)){//开始拿剩下的元素跟数组中的比较0、1、2for (j<-2 until(i,-1)){top3(j)=top3(j-1)//开始挪地方了,比如:i=0,表示新值要插入在0号位,把1号位的值挪到2号,0号位的旧值挪到1号位}top3(i)=currentOne//把这个新成员插入进来loop.break()//插入一次,跳出重新再来下一轮}}}}(className,top3.toBuffer)}).collect().foreach(println)}
}

2.Java实现:

public class TopN {public static void main(String[] args) {SparkConf sparkConf = new SparkConf();sparkConf.setMaster("local");sparkConf.setAppName("topn");JavaSparkContext sc = new JavaSparkContext(sparkConf);JavaRDD<String> lines = sc.textFile("data/scores");JavaPairRDD<String, Integer> pairRDD = lines.mapToPair(new PairFunction<String, String, Integer>() {@Overridepublic Tuple2<String, Integer> call(String s) throws Exception {return new Tuple2<String, Integer>(s.split(" ")[0], Integer.valueOf(s.split(" ")[1]));}});pairRDD.groupByKey().foreach(new VoidFunction<Tuple2<String, Iterable<Integer>>>() {@Overridepublic void call(Tuple2<String, Iterable<Integer>> tp) throws Exception {String className = tp._1;Iterator<Integer> iter = tp._2.iterator();Integer[] top3 = new Integer[3];while (iter.hasNext()){Integer currentOne = iter.next();for (int i = 0; i < 3; i++) {if (top3[i]==null){top3[i]=currentOne;break;}else if(currentOne>top3[i]){for (int j = 2; j >i; j--) {top3[j]=top3[j-1];}top3[i]=currentOne;break;}}}for (Integer i:top3){System.out.println("className="+className+";value="+i);}}});}
}

数据算法——Spark的TopN实现相关推荐

  1. 数据算法——Spark二次排序

    1.Scala实现: /*** 二次排序:超过2列(特征)* 对比MR天气案例,自定义一个key(包含读到的一行数字),对key进行内部比较.*/ object SecondSort {def mai ...

  2. [Spark的TopN算法实现]

    一.TopN算法 MapReduce中的TopN算法是一个经典的算法,由于每个map都只是实现了本地的TopN算法,而假设map有M个,在归约的阶段只有M x N次运算,这个结果是可以接受的并不会造成 ...

  3. spark的数三角形算法_数据算法 Hadoop Spark大数据处理技巧 PDF 下载

    相关截图: 资料简介: 本书介绍了很多基本设计模式.优化技术和数据挖掘及机器学习解决方案,以解决生物信息学.基因组学.统计和社交网络分析等领域的很多问题.这本书还概要介绍了MapReduce.Hado ...

  4. 《大数据算法》一1.2 大数据算法

    本节书摘来华章计算机<大数据算法>一书中的第1章 ,第1.2节,王宏志 编著, 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 1.2 大数据算法 这一节我们概 ...

  5. HQL写topN、Spark写topN

    HQL写topN用窗口函数rank() .row_number().dense_rank() 1.rank(),跳跃排序,假如第一第二相同,那么第三个就是3 select * from( select ...

  6. 【大数据】Spark面试100问 | CSDN博文精选

    戳蓝字"CSDN云计算"关注我们哦! 作者 |  游骑小兵 责编 | 阿秃 Q:什么是Spark? A:简单理解,Spark是在Hadoop基础上的改进,是UC Berkeley ...

  7. 大数据自学——Spark

    Spark自学之路 Spark基础--思维导图 #1.1Spark是什么 Apache Spark 是一个快速的,多用途的计算系统,相对于Hadoop MapReduce将中间结果保存在磁盘中,Spa ...

  8. 漫画趣解大数据算法建模:买瓜

    大数据开发如何转型算法? 算法建模主要做什么?调参为什么玄学? 如何通俗理解算法建模过程.. 夕阳下的村东头,有一人来买瓜. 1 引子(买瓜) 忙碌的一天刚刚结束,村里的小张就匆匆的骑上车,准备买个西 ...

  9. 大数据算法培养计划!

    立春节气已经过去了一个多月,但职场却迎来了真正的就业寒冬."旺季不旺" ,职场人期待在年后招聘季实现的跳槽.涨薪.转行,只能被暂时搁置. 根据智联招聘最新发布的调研数据来看:春节后 ...

最新文章

  1. 将不确定变成确定~frameset页面不能正确加载
  2. CentOS基础网络配置路由和默认网关
  3. subsonic mysql_Subsonic 介绍
  4. c语言图片见水印,[求助]C语言 bmp文件加上水印
  5. HDU 1492 The number of divisors(约数) about Humble Numbers(数论,简单约数)
  6. shell脚本中数组的长度表示
  7. kudu :impala 和 kuduClient 的选择
  8. 上传文件到某文件夹时,提示...路径访问被拒绝
  9. 概率图模型笔记(三)条件随机场(CRF)基础
  10. Linux命令之dos2unix - 将DOS格式文本文件转换成UNIX格式
  11. paroot忘记root密码
  12. 论文笔记_S2D.59_2015-ICRA_V-LOAM_低漂移、鲁棒和快速的视觉-激光 里程计和建图
  13. 大数据概览以及当下实用的主流开发
  14. vivo 应用商店推荐系统探索与实践
  15. BeautifulSoup总结及contents内容分析
  16. Android-AIUI技能设计技巧及处理策略总结
  17. javaWeb(b站狂神说)
  18. 怎么点亮段码屏_段码LCD液晶屏驱动方法
  19. JQuery中closet、toggleClass、removeClass、addClass理解
  20. 阿里云 云盾 安骑士 监控ECS离线 安全组规则 ip设置

热门文章

  1. labview波形图两个游标,LabVIEW数据可视化:使用波形图表控件逐点显示曲线的方法...
  2. python写端口扫描器_使用Python编写简单的端口扫描器的实例分享
  3. 关于如何用100行如何实现docker
  4. IntelliJ IDEA Community 社区版配置 Web 开发环境(Gradle + Tomcat)
  5. sql insert and update
  6. parasoft Jtest 使用教程:创建并使用参数化测试用例(上)
  7. express 的 middleware 设计
  8. 虚拟化之安装Xen实例
  9. 常用的shell脚本案例(14.04.15更新)
  10. Linux下安装Tomcat