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 pais=lines.mapToPair(new PairFunction() {
    @Override
    public Tuple2 call(String s) throws Exception {
        return new Tuple2(Integer.valueOf(s),Integer.valueOf(s));
    }
});
JavaPairRDD sortp=pais.sortByKey(false);
JavaRDD nums=sortp.map(new Function, Integer>() {
    @Override
    public Integer call(Tuple2 s) throws Exception {
        return s._1;
    }
});
List 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 pairs=lines.mapToPair(new PairFunction() {
    @Override
    public Tuple2 call(String s) throws Exception {
        String [] values=s.split(" ");
        return new Tuple2(values[0],Integer.valueOf(values[1]));
    }
});
JavaPairRDD> pairgroup=pairs.groupByKey();
JavaPairRDD> pair=pairgroup.mapToPair(new PairFunction>,
        String, Iterable>() {
    @Override
    public Tuple2> call(Tuple2> s) throws Exception {
        int n=3;
        Integer [] topn=new Integer[n];
        String className=s._1;
        java.util.Iterator 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>(className, Arrays.asList(topn));
    }
});
pair.foreach(new VoidFunction>>() {
    @Override
    public void call(Tuple2> s) throws Exception {
        System.out.println("class"+s._1());
        Iterator ss=s._2.iterator();
        while(ss.hasNext()){
            System.out.println(ss.next());
        }
    }
});

}

你可能感兴趣的:(spark)