Spark: topN

博客主要介绍了针对一串数字和 pair 类型数据进行 Top N 处理的相关内容。给出了一串数字示例,还展示了 pair 类型中班级与分数的对应数据,用于说明不同类型数据的 Top N 处理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

针对一串数字进行 Top 的处理

3
5
6
7
1
4
5
6
9
0
3

public class TestTop3 {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf();
        conf.setAppName("WordCountSort");
        conf.setMaster("local");

        JavaSparkContext jsc = new JavaSparkContext(conf);
        jsc.setLogLevel("ERROR");

        JavaRDD<String> lines = jsc.textFile("in/top.txt");

        JavaPairRDD<Integer,String> pairs= lines.mapToPair(new PairFunction<String,Integer,String>() {
            private static final long serialVersionUID = 1L;
            @Override
            public Tuple2<Integer, String> call(String s) throws Exception {
                return new Tuple2<Integer, String>(Integer.valueOf(s),s);
            }
        });

         // 反向排序
        JavaPairRDD<Integer,String> sortedPairs = pairs.sortByKey(false);
        
        JavaRDD<Integer> mapRDD = sortedPairs.map(new Function<Tuple2<Integer,String>, Integer>() {
            private static final long serialVersionUID = 1L;
            @Override
            public Integer call(Tuple2<Integer, String> v1) throws Exception {
                System.out.println("map: "+v1._1);
                return v1._1;
            }
        });

        List<Integer> listTop3 = mapRDD.take(3);

        for(Integer num:listTop3){
            System.out.println(num);
        }

        jsc.stop();
    }
}

针对 pair 类型进行 top N 的处理

class1 90
class2 56
class1 87
class1 76
class2 88
class1 95
class1 74
class2 87
class2 67
class2 77

public class GroupTop3 {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf();
        conf.setAppName("WordCountSort");
        conf.setMaster("local");

        JavaSparkContext jsc = new JavaSparkContext(conf);
        jsc.setLogLevel("ERROR");

        JavaRDD<String> lines = jsc.textFile("in/score.txt");

        // 对 PairRDD 进行分组
        JavaPairRDD<String,Iterable<Integer>> groupRDD = lines.mapToPair(new PairFunction<String, String, Integer>() {
            private static final long serialVersionUID = 1L;
            @Override
            public Tuple2<String, Integer> call(String s) throws Exception {
                return new Tuple2<String, Integer>(s.split(" ")[0],Integer.valueOf(s.split(" ")[1]));
            }
        }).groupByKey();

        //对分组后的 RDD 的 value 进行排序
        JavaPairRDD<String, Iterable<Integer>> pairRDD = groupRDD.mapToPair(new PairFunction<Tuple2<String,Iterable<Integer>>, String, Iterable<Integer>>() {
            private static final long serialVersionUID = 1L;
            @Override
            public Tuple2<String, Iterable<Integer>> call(Tuple2<String, Iterable<Integer>> s) throws Exception {
                Integer[] top3 = new Integer[3];

                String className = s._1;
                Iterator<Integer> scores = s._2.iterator();

                while (scores.hasNext()){
                    Integer score = scores.next();
                    System.out.print("Mtop: "+score+",  ");
                    for(int i =0;i< 3;i++){
                        if(top3[i] ==null){
                            top3[i] = score; 
                            System.out.println("Atop["+i+"]"+top3[i]); 
                            break;
                        }else if(score > top3[i]){ 
                            for(int j = 2;j> i;j--){
                                top3[j] = top3[j-1];
                              //  System.out.println("Btop["+j+"]"+top3[j]);
                            }
                            top3[i] =score;
                            break;
                        }
                    }
                }
                return new Tuple2<String, Iterable<Integer>>(className, Arrays.asList(top3));
            }
        });

        pairRDD.foreach(new VoidFunction<Tuple2<String, Iterable<Integer>>>() {
            @Override
            public void call(Tuple2<String, Iterable<Integer>> v) throws Exception {
                Iterator<Integer> scoreList = v._2.iterator();
                System.out.println("class: " + v._1);
                while (scoreList.hasNext()){
                    Integer score = scoreList.next();

                    System.out.println(score);
                }
            }
        });

        jsc.stop();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值