spark 二次排序

原创 2018年04月15日 15:06:31

通过代码实现spark的二次排序

1 实现二次排序接口ordered

/**
 * 自定义的二次排序key
 * @author Administrator
 *
 */
public class SecondarySortKey implements Ordered<SecondarySortKey>, Serializable {

   private static final long serialVersionUID = -2366006422945129991L;
   
   // 首先在自定义key里面,定义需要进行排序的列
   private int first;
   private int second;
   
   public SecondarySortKey(int first, int second) {
      this.first = first;
      this.second = second;
   }

   @Override
   public boolean $greater(SecondarySortKey other) {
      if(this.first > other.getFirst()) {
         return true;
      } else if(this.first == other.getFirst() && 
            this.second > other.getSecond()) {
         return true;
      }
      return false;
   }
   
   @Override
   public boolean $greater$eq(SecondarySortKey other) {
      if(this.$greater(other)) {
         return true;
      } else if(this.first == other.getFirst() && 
            this.second == other.getSecond()) {
         return true;
      }
      return false;
   }

   @Override
   public boolean $less(SecondarySortKey other) {
      if(this.first < other.getFirst()) {
         return true;
      } else if(this.first == other.getFirst() && 
            this.second < other.getSecond()) {
         return true;
      }
      return false;
   }
   
   @Override
   public boolean $less$eq(SecondarySortKey other) {
      if(this.$less(other)) {
         return true;
      } else if(this.first == other.getFirst() && 
            this.second == other.getSecond()) {
         return true;
      }
      return false;
   }
   
   @Override
   public int compare(SecondarySortKey other) {
      if(this.first - other.getFirst() != 0) {
         return this.first - other.getFirst();
      } else {
         return this.second - other.getSecond();
      }
   }
   
   @Override
   public int compareTo(SecondarySortKey other) {
      if(this.first - other.getFirst() != 0) {
         return this.first - other.getFirst();
      } else {
         return this.second - other.getSecond();
      }
   }
   
   // 为要进行排序的多个列,提供getter和setter方法,以及hashcode和equals方法
   public int getFirst() {
      return first;
   }

   public void setFirst(int first) {
      this.first = first;
   }

   public int getSecond() {
      return second;
   }

   public void setSecond(int second) {
      this.second = second;
   }

   @Override
   public int hashCode() {
      final int prime = 31;
      int result = 1;
      result = prime * result + first;
      result = prime * result + second;
      return result;
   }

   @Override
   public boolean equals(Object obj) {
      if (this == obj)
         return true;
      if (obj == null)
         return false;
      if (getClass() != obj.getClass())
         return false;
      SecondarySortKey other = (SecondarySortKey) obj;
      if (first != other.first)
         return false;
      if (second != other.second)
         return false;
      return true;
   }
   
}

2 实现排序集群

/**
 * 二次排序
 * 1、实现自定义的key,要实现Ordered接口和Serializable接口,在key中实现自己对多个列的排序算法
 * 2、将包含文本的RDD,映射成key为自定义key,value为文本的JavaPairRDD
 * 3、使用sortByKey算子按照自定义的key进行排序
 * 4、再次映射,剔除自定义的key,只保留文本行
 * @author jhp
 *
 */
public class SecondarySort {

   public static void main(String[] args) {
      SparkConf conf = new SparkConf()
            .setAppName("SecondarySort") 
            .setMaster("local");
      JavaSparkContext sc = new JavaSparkContext(conf);
   
      JavaRDD<String> lines = sc.textFile("C://Users//Administrator//Desktop//sort.txt");
      
      JavaPairRDD<SecondarySortKey, String> pairs = lines.mapToPair(
            
            new PairFunction<String, SecondarySortKey, String>() {

               private static final long serialVersionUID = 1L;

               @Override
               public Tuple2<SecondarySortKey, String> call(String line) throws Exception {
                  String[] lineSplited = line.split(" ");  
                  SecondarySortKey key = new SecondarySortKey(
                        Integer.valueOf(lineSplited[0]), 
                        Integer.valueOf(lineSplited[1]));  
                  return new Tuple2<SecondarySortKey, String>(key, line);
               }
               
            });
      
      JavaPairRDD<SecondarySortKey, String> sortedPairs = pairs.sortByKey();
      
      JavaRDD<String> sortedLines = sortedPairs.map(
            
            new Function<Tuple2<SecondarySortKey,String>, String>() {

               private static final long serialVersionUID = 1L;

               @Override
               public String call(Tuple2<SecondarySortKey, String> v1) throws Exception {
                  return v1._2;
               }
               
            });
      
      sortedLines.foreach(new VoidFunction<String>() {

         private static final long serialVersionUID = 1L;

         @Override
         public void call(String t) throws Exception {
            System.out.println(t);  
         }
         
      });
      
      sc.close();
   }
   
}

Spark二次排序

Spark当中做二次排序非常简单,因为有大量的现成函数已经实现了,只需要进行组合运用就好 在这里进行一下二次排序的总结 如果对两列或多列同时进行升序或降序排序的话比较容易实现 初始数据 ...
  • u012102306
  • u012102306
  • 2016-11-10 15:04:22
  • 1248

Spark的高级排序(二次排序)

spark 二次排序
  • wuxintdrh
  • wuxintdrh
  • 2017-05-30 11:20:56
  • 1840

Spark基础排序+二次排序(java+scala)

1.基础排序算法 2.二次排序算法 3.更高级别排序 4.排序算法内幕 1.基础排序算法sc.textFile("/data/putfile.txt").flatMap(_.split(" "...
  • sundujing
  • sundujing
  • 2016-05-13 23:28:10
  • 5935

spark 二次排序实现

spark 二次排序实现
  • high2011
  • high2011
  • 2016-06-04 15:27:38
  • 912

SPARK排序算法,使用Scala开发 二次排序 自定义KEY值,相比JAVA的罗嗦,Scala优雅简洁!!!

Spark使用Scala开发的二次排序 【数据文件Input】 2 3  4 1  3 2  4 3  8 7  2 1 【运行结果Output】倒排序 8 7 4 3 4 1 ...
  • duan_zhihua
  • duan_zhihua
  • 2016-02-28 21:20:06
  • 3059

Hadoop和Spark分别实现二次排序

将下列数据中每个分区中的第一列顺序排列,第二列倒序排列。 Text  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15...
  • guohecang
  • guohecang
  • 2016-05-03 21:33:43
  • 1032

Spark 使用sortByKey进行二次排序

Spark的sortByKey API允许自定义排序规则,这样就可以进行自定义的二次排序、三次排序等等。 先来看一下sortByKey的源码实现:def sortByKey(): JavaPairR...
  • u010110208
  • u010110208
  • 2016-08-15 07:33:48
  • 2559

Spark分组二次排序

在运用Spark数据处理中,有时要对数据进行分组(二次)排序。数据存储在HDFS中。实现代码如下: package com.ibeifeng.spark.core import org.apa...
  • Spark2creat_palains
  • Spark2creat_palains
  • 2017-06-14 21:42:25
  • 480

Spark: sortBy sortByKey 二次排序

Sample data(考场号,班级号,学号)–> 考场号升序,班级号升序,学号降序1 1 3 1 1 4 1 2 8 1 3 7 3 2 9 3 5 11 1 4 13 1 5 12 2 1 14 ...
  • wqhaber
  • wqhaber
  • 2017-09-12 12:29:12
  • 281

【spark】sortByKey实现二次排序

spark 二次排序
  • a6210575
  • a6210575
  • 2016-08-21 20:38:48
  • 2363
收藏助手
不良信息举报
您举报文章:spark 二次排序
举报原因:
原因补充:

(最多只允许输入30个字)