import org.apache.spark.SparkConf; import org.apache.spark.SparkContext; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.PairFunction; import scala.Int; import scala.Tuple2; import java.util.Arrays; import java.util.List; /** * Created by MC on 2018/6/6. * java编写二次排序,第一个值正序,第二个值倒序 * 两种写法: * java编写 * 兰姆达表达式 * (把兰姆达表达式进行注释,解开java写法,效果一样) * (个人感觉兰姆达表达式写法比较简单轻便) */ public class SecondSort_java { public static String mySecondSort(JavaSparkContext jsc){ List<Tuple2<Integer, Integer>> arr1 = Arrays.asList( new Tuple2<Integer, Integer>(11, 5), new Tuple2<Integer, Integer>(22, 5), new Tuple2<Integer, Integer>(33, 4), new Tuple2<Integer, Integer>(33, 5), new Tuple2<Integer, Integer>(22, 2), new Tuple2<Integer, Integer>(11, 1)); JavaPairRDD<Integer, Integer> rdd1 = jsc.parallelizePairs(arr1); //兰姆达表达式写法 JavaPairRDD<SecondSortEntity, Tuple2<Integer, Integer>> rdd2 = rdd1.mapToPair(x -> new Tuple2<SecondSortEntity, Tuple2<Integer, Integer>>(new SecondSortEntity(x._1, x._2), x)); JavaPairRDD<SecondSortEntity, Tuple2<Integer, Integer>> rdd3 = rdd2.sortByKey(); return rdd3.collect().toString(); //java写法 // JavaPairRDD<SecondSortEntity, Tuple2<Integer, Integer>> rdd2 = rdd1.mapToPair(new PairFunction<Tuple2<Integer, Integer>, SecondSortEntity, Tuple2<Integer, Integer>>() { // @Override // public Tuple2<SecondSortEntity, Tuple2<Integer, Integer>> call(Tuple2<Integer, Integer> x) throws Exception { // return new Tuple2<SecondSortEntity, Tuple2<Integer, Integer>>(new SecondSortEntity(x._1, x._2), x); // } // }); // JavaPairRDD<SecondSortEntity, Tuple2<Integer, Integer>> rdd3 = rdd2.sortByKey(); // return rdd3.collect().toString(); } public static void main(String[] args){ SparkConf conf = new SparkConf().setMaster("local").setAppName("SecondSort_java"); JavaSparkContext jsc = new JavaSparkContext(conf); String result = ""; result = mySecondSort(jsc); System.out.println(result); }
}
//实体类
import scala.Serializable; import scala.math.Ordered; /** * Created by MC on 2018/6/6. */ public class SecondSortEntity implements Ordered<SecondSortEntity>, Serializable{ private int num1; private int num2; public void setNum2(int num2) { this.num2 = num2; } public SecondSortEntity(int num1, int num2) { this.num1 = num1; this.num2 = num2; } public SecondSortEntity() { } @Override public boolean $less(SecondSortEntity that) { return true; } @Override public boolean $greater(SecondSortEntity that) { return false; } @Override public boolean $less$eq(SecondSortEntity that) { return $less(that); } @Override public boolean $greater$eq(SecondSortEntity that) { return $greater(that); } @Override public int compare(SecondSortEntity that) { int result = this.num1-that.num1; //设置二次排序方式,当第一个值排序后对第二个值进行二次排序 if(result == 0)result=that.num2-this.num2; return result; } @Override public int compareTo(SecondSortEntity that) { return compare(that); } }