假设有这样一个文件,文件内容如下

class1
class2
class1
class1
class2
class2
class1
class2
class1
class2

要求按照班级分组取出每个班前三名,源码如下:

package swy.spark.spark_study_java.core;

import java.util.Arrays;
import java.util.Iterator; import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction; import scala.Tuple2; /**
* 分组取top3
* @author swy
*
*/ public class GroupTop3 { public static void main(String[] args) {
SparkConf conf = new SparkConf()
.setAppName("ActionOperation")
.setMaster("local");
//.setMaster("spark://192.168.43.124:7077"); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> lines = sc.textFile("E://swy//resource//workspace-neno//spark-study-java//txt//score.txt"); JavaPairRDD<String, Integer> pairs = lines.mapToPair(
new PairFunction<String, String, Integer>(){ private static final long serialVersionUID = 1L; public Tuple2<String, Integer> call(String s) throws Exception {
String[] lineSpited = s.split(" ");
return new Tuple2<String, Integer>(lineSpited[0], Integer.valueOf(lineSpited[1]));
} }); //将成绩按班级分组
JavaPairRDD<String, Iterable<Integer>> groupPairs = pairs.groupByKey(); JavaPairRDD<String, Iterable<Integer>> top3Sores = groupPairs.mapToPair(
new PairFunction<Tuple2<String, Iterable<Integer>>, String, Iterable<Integer>>(){ private static final long serialVersionUID = 1L; public Tuple2<String, Iterable<Integer>> call (
Tuple2<String, Iterable<Integer>> classSorces) throws Exception {
Integer[] top3 = new Integer[3]; String className = classSorces._1;
Iterator<Integer> scores = classSorces._2.iterator(); while (scores.hasNext()) {
Integer score = scores.next(); for (int i = 0; i<3; i++) {
if (top3[i] == null) {
top3[i] = score;
break;
} else if (score > top3[i]) {
int tmp = top3[i];
top3[i] = score; if (i < top3.length - 1) {
top3[i+1] = tmp;
}
break;
}
}
}
return new Tuple2<String,
Iterable<Integer>>(className, Arrays.asList(top3));
}
}); top3Sores.foreach(new VoidFunction<Tuple2<String, Iterable<Integer>>>(){
private static final long serialVersionUID = 1L; public void call(Tuple2<String, Iterable<Integer>> v) throws Exception {
System.out.println("班级:" + v._1);
System.out.println("前三名:" + v._2);
} }); sc.close();
}
} 

topN的排序算法可以理解:

假如有三个山洞,一群土匪排着队来抢占山洞,按如下规则占领山洞,下面算法保证第一个山洞主人永远是最厉害的,以此类推

土匪 :待排序序列
三个山洞:top3
妻子:一个临时tmp变量
打架:比较大小
for (土匪 : i) {
for (山洞 : i) {
if( 山洞空)
入住 ;
break;
else (山洞有人:和原主人打架) {
            if (打赢){
入住
原主人带着妻子住下一个山洞(假如还有的话)
}
break;
}
}
}

实现:

while (scores.hasNext()) {
Integer score = scores.next(); for (int i = ; i<; i++) {
if (top3[i] == null) {
top3[i] = score;
break;
} else if (score > top3[i]) {
int tmp = top3[i];
top3[i] = score; if (i < top3.length - ) {
top3[i+] = tmp;
}
break;
}
}
}

  

最新文章

  1. UItableview section和cell的局部刷新
  2. wampserver2.6下UCenter1.6.0与UCenter Home2.0整合安装
  3. 第六十八篇、OC_按照某一字段对数值进行排序
  4. (Entity FrameWork)Code First to an Existing Database
  5. Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01
  6. jsp_javabean
  7. origin从图中获得数据
  8. 【一天一道LeetCode】#89. Gray Code
  9. SqlServer无备份下误删数据恢复
  10. WMI入门教程之WMI中的类在哪里?
  11. goroutine 和 线程的区别
  12. [物理学与PDEs]第2章第2节 粘性流体力学方程组 2.5 粘性热传导流体动力学方程组的数学结构
  13. yii创建控制台命令
  14. Python测试框架之Unittest梳理
  15. jsp 一点点
  16. 第三个spring冲刺第4天
  17. 【转载】常用 Java 静态代码分析工具的分析与比较
  18. 蓝牙学习笔记三(Android Debug)
  19. Django_重装系统后无法使用 sqlite 数据库报错:com.intellij.execution.ExecutionException: Exception in thread &quot;main&quot; java.lang.ClassNotFoundException: org.sqlite.JDBC
  20. 关于LNMP常见问题和性能方面的个人理解

热门文章

  1. linux-pclint代码检测
  2. Chrome 浏览器垃圾回收机制与内存泄漏分析
  3. Drive Scope Mac硬盘检查分析神器
  4. 雷子聊并发编程(001):基础知识之串行&amp;并行&amp;并发
  5. Spark执行流程(转)
  6. Linux x64 Hadoop-2.4.1配置-解决错误Unable to load native-hadoop library for your platform
  7. 页面报错常用状态码总结(Http常见状态码)
  8. quartus使用串口IP模块
  9. Unity资源加载路径及加载方式小结
  10. 从《国产凌凌漆》看到《头号玩家》,你就能全面了解5G