說謊和沉默可以說是現在人類社會裏日漸蔓延的兩大罪惡。事實上,我們經常說謊,動不動就沉默不語。
——村上春樹
本文主要介紹了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());
}
}
});
}