Spark中topN和groupTopn講解

說謊和沉默可以說是現在人類社會裏日漸蔓延的兩大罪惡。事實上,我們經常說謊,動不動就沉默不語。

——村上春樹

本文主要介紹了Spark中去topN的操作和分組取topN的操作
topN的實現思路:

1、首先我們需要採用PairRDD的方式來存儲數據對象,PairRDD裏面的key和value儘量都保存成一樣的

2、在採用sortByKey對key進行排序

3、在採用Map的操作將PairRDD的中的key或者value取出來做爲一個新的RDD

4、這個時候可以採用take算子進行topN操作了

JavaPairRDD<Integer,Integer> pais=lines.mapToPair(new PairFunction<String, Integer, Integer>() {
    @Override
    public Tuple2<Integer, Integer> call(String s) throws Exception {
        return new Tuple2<Integer, Integer>(Integer.valueOf(s),Integer.valueOf(s));
    }
});
JavaPairRDD<Integer,Integer> sortp=pais.sortByKey(false);
JavaRDD<Integer> nums=sortp.map(new Function<Tuple2<Integer,Integer>, Integer>() {
    @Override
    public Integer call(Tuple2<Integer, Integer> s) throws Exception {
        return s._1;
    }
});
List<Integer> num=nums.top(3);
for (Integer i:num){
    System.out.println(i);
}

分組求和,和topN的操作有點不一樣

1、先生成一個PairRDD,這個key和value分別是組和值

2、對這個PairRDD進行groupByKey這時候返回一個PairRDD但是value是一個Iterable

3、對上面這個PairRDD進行一個Pair操作,這個操作是將每個key裏面的value進行排序,取出topN的操作。這裏用了數組的排序算法

4、最近將結果輸出

JavaPairRDD<String,Integer> pairs=lines.mapToPair(new PairFunction<String, String, Integer>() {
    @Override
    public Tuple2<String, Integer> call(String s) throws Exception {
        String [] values=s.split(" ");
        return new Tuple2<String,Integer>(values[0],Integer.valueOf(values[1]));
    }
});
JavaPairRDD<String, Iterable<Integer>> pairgroup=pairs.groupByKey();
JavaPairRDD<String, Iterable<Integer>> pair=pairgroup.mapToPair(new PairFunction<Tuple2<String,Iterable<Integer>>,
        String, Iterable<Integer>>() {
    @Override
    public Tuple2<String, Iterable<Integer>> call(Tuple2<String, Iterable<Integer>> s) throws Exception {
        int n=3;
        Integer [] topn=new Integer[n];
        String className=s._1;
        java.util.Iterator<Integer> sorce=s._2.iterator();
        while(sorce.hasNext()){
            Integer ss =sorce.next();
            for(int i = 0; i < n; i++) {
                if(topn[i] == null) {
                    topn[i] = ss;
                    break;
                } else if(ss > topn[i]) {
                    for(int j = n-1; j > i; j--) {
                        topn[j] = topn[j - 1];
                    }
                    topn[i] = ss;
                    break;
                }
            }
        }
        return new Tuple2<String,Iterable<Integer>>(className, Arrays.asList(topn));
    }
});
pair.foreach(new VoidFunction<Tuple2<String, Iterable<Integer>>>() {
    @Override
    public void call(Tuple2<String, Iterable<Integer>> s) throws Exception {
        System.out.println("class"+s._1());
        Iterator<Integer> ss=s._2.iterator();
        while(ss.hasNext()){
            System.out.println(ss.next());
        }
    }
});

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章