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

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;
}
}
}

  

分组取topN的更多相关文章

  1. spark 分组取topn

    java /** *分组取topn,有序数列去除一些项后,仍然有序,所以应当先排序后分组 *@author Tele * */ public class TopDemo2 { private stat ...

  2. mysql分组取topn

    本文来自  http://www.jb51.net/article/31590.htm 有些语句sql top n 是sqlserver语法 --按某一字段分组取最大(小)值所在行的数据 代码如下: ...

  3. Spark 两种方法计算分组取Top N

    Spark 分组取Top N运算 大数据处理中,对数据分组后,取TopN是非常常见的运算. 下面我们以一个例子来展示spark如何进行分组取Top的运算. 1.RDD方法分组取TopN from py ...

  4. 使用dataframe解决spark TopN问题:分组、排序、取TopN和join相关问题

    package com.profile.mainimport org.apache.spark.sql.expressions.Windowimport org.apache.spark.sql.fu ...

  5. Hive分组取Top K数据

    阿里交叉面试问到了这个题,当时感觉没有答好,主要是对Hive这块还是不熟悉,其实可以采用row_number()函数. 1.ROW_NUMBER,RANK(),DENSE_RANK() 语法格式:ro ...

  6. sql 分组取最新的数据sqlserver巧用row_number和partition by分组取top数据

    SQL Server 2005后之后,引入了row_number()函数,row_number()函数的分组排序功能使这种操作变得非常简单 分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系 ...

  7. mysql单列去重复group by分组取每组前几条记录加order by排序

    mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下 --按某一字段分组取最大(小)值所在行的数据 复制代码代码如下: /* 数据如下: name ...

  8. row_number和partition by分组取top数据

    分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...

  9. sql分组取第一条数据

    sq分组取第一条数据的一个方法: select * from ( select row_number() over(partition by ID order by ID) as rownum , * ...

随机推荐

  1. 基于STL的堆略解

    什么是STL 以下内容摘自这儿. STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Le ...

  2. CSAPP:逆向工程【缓冲区溢出攻击】

    逆向工程[缓冲区溢出攻击] 任务描述 掌握函数调用时的栈帧结构,利用输入缓冲区的溢出漏洞,将攻击代码嵌入当前程序的栈帧中,使程序执行我们所期望的过程. 主要方法 溢出的字符将覆盖栈帧上的数据,会覆盖程 ...

  3. 利用Veeam保护SAP HANA数据库

    利用Veeam保护SAP HANA数据库 前言 针对越来越多的SAP HANA备份需求,我们Team翻译.整理.借鉴了Veeam 的SAP HANA 大神 Clemens Zerbe 和 Ali Sa ...

  4. 基于 HTML5 Canvas 的楼宇自控系统

    前言 楼宇自控是指楼宇中电力设备,如电梯.水泵.风机.空调等,其主要工作性质是强电驱动.通常这些设备是开放性的工作状态,也就是说没有形成一个闭环回路.只要接通电源,设备就在工作,至于工作状态.进程.能 ...

  5. Lambda函数及其用法

    Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行? 当然可以啦.有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可. 先来看个简单lambda函 ...

  6. 【RabbitMQ 实战指南】一 延迟队列

    1.什么是延迟队列 延迟队列中存储延迟消息,延迟消息是指当消息被发送到队列中不会立即消费,而是等待一段时间后再消费该消息. 延迟队列很多应用场景,一个典型的应用场景是订单未支付超时取消,用户下单之后3 ...

  7. SpringCloud学习--微服务架构

    目录 微服务架构快速指南 SOA Dubbo Spring Cloud Dubbo与SpringCloud对比 微服务(Microservice)架构快速指南 什么是软件架构? 软件架构是一个包含各种 ...

  8. Java基础(38)AbstractMap类

    AbstractMap类的子类有HashMap(其子类是LinkedHashMap).TreeMap.EnumMap.WeakHashMap和IdentityHashMap. 1.HashMap (1 ...

  9. SpringBoot整合MybatisPlus3.X之SQL执行分析插件(十四)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  10. .Net Core WebApi(三)在Linux服务器上部署

    鸽了好久,终于有个时间继续写了,继上一篇之后,又写(水)了一篇,有什么不足之处请大家指出,多谢各位了. 下面有两个需要用到的软件,putty和pscp,我已经上传到博客园了,下载请点击这里. 一.准备 ...