分组取topN
2024-09-01 17:25:10
假设有这样一个文件,文件内容如下
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;
}
}
}
最新文章
- UItableview section和cell的局部刷新
- wampserver2.6下UCenter1.6.0与UCenter Home2.0整合安装
- 第六十八篇、OC_按照某一字段对数值进行排序
- (Entity FrameWork)Code First to an Existing Database
- Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01
- jsp_javabean
- origin从图中获得数据
- 【一天一道LeetCode】#89. Gray Code
- SqlServer无备份下误删数据恢复
- WMI入门教程之WMI中的类在哪里?
- goroutine 和 线程的区别
- [物理学与PDEs]第2章第2节 粘性流体力学方程组 2.5 粘性热传导流体动力学方程组的数学结构
- yii创建控制台命令
- Python测试框架之Unittest梳理
- jsp 一点点
- 第三个spring冲刺第4天
- 【转载】常用 Java 静态代码分析工具的分析与比较
- 蓝牙学习笔记三(Android Debug)
- Django_重装系统后无法使用 sqlite 数据库报错:com.intellij.execution.ExecutionException: Exception in thread ";main"; java.lang.ClassNotFoundException: org.sqlite.JDBC
- 关于LNMP常见问题和性能方面的个人理解
热门文章
- linux-pclint代码检测
- Chrome 浏览器垃圾回收机制与内存泄漏分析
- Drive Scope Mac硬盘检查分析神器
- 雷子聊并发编程(001):基础知识之串行&;并行&;并发
- Spark执行流程(转)
- Linux x64 Hadoop-2.4.1配置-解决错误Unable to load native-hadoop library for your platform
- 页面报错常用状态码总结(Http常见状态码)
- quartus使用串口IP模块
- Unity资源加载路径及加载方式小结
- 从《国产凌凌漆》看到《头号玩家》,你就能全面了解5G