Spark高級編程之二次排序

原始數(shù)據(jù):

2 6
3 7
1 5
2 4
3 6
1 3
2 1
3 1

1悼尾、Java版二次排序
首先定義排序的key

/**
 * 自定義的二次排序
 */
public class SecondarySortKey implements Ordered<SecondarySortKey>,Serializable{
   private static final long serialVersionUID = -236567544543677678L;

   //首先在自定義key里面梭灿,定義需要進行排序的列
    private int first;
    private int second;

    public SecondarySortKey(int first, int second) {
        this.first = first;
        this.second = second;
    }

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

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

    @Override
    public boolean $less(SecondarySortKey that) {
        if(this.first<that.getFirst()){
            return true;
        }else if(this.first==that.getFirst() &&
                this.second <that.getSecond()){
            return true;
        }
        return false;
    }

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

    @Override
    public int compare(SecondarySortKey that) {
        if(this.first - that.getFirst() !=0){
            return this.first - that.getFirst();
        }else{
            return this.second - that.getSecond();
        }
    }



    @Override
    public int compareTo(SecondarySortKey that) {
        if(this.first - that.getFirst() !=0){
            return this.first - that.getFirst();
        }else{
            return this.second - that.getSecond();
        }
    }

    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;
    }
}

然后實現(xiàn)二次排序

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;
import scala.Tuple2;

/**
 * 二次排序
 */
public class SecondarySort {

    public static void main(String[] args) {
        String inputPath ="D:\\spark\\sortnumber.txt";
        long beginTime = System.currentTimeMillis();
        SparkConf conf = new SparkConf()
                .setAppName("SecondarySort")//應(yīng)用程序的名稱
                .setMaster("local");//本地運行
        //2阴汇、創(chuàng)建JavaSparkContext對象
        JavaSparkContext sc = new JavaSparkContext(conf);
        JavaRDD<String> lines = sc.textFile(inputPath);
        JavaPairRDD<SecondarySortKey, String> pairRDD = lines.mapToPair(new PairFunction<String, SecondarySortKey, String>() {
            @Override
            public Tuple2<SecondarySortKey, String> call(String line) throws Exception {
                String[] split = line.split(" ");
                SecondarySortKey key = new SecondarySortKey(Integer.valueOf(split[0]), Integer.valueOf(split[1]));
                return new Tuple2<SecondarySortKey, String>(key, line);
            }
        });

        JavaPairRDD<SecondarySortKey, String> sortedPairs = pairRDD.sortByKey();
        JavaRDD<String> sortedLines = sortedPairs.map(new Function<Tuple2<SecondarySortKey, String>, String>() {
            @Override
            public String call(Tuple2<SecondarySortKey, String> v1) throws Exception {
                return v1._2;
            }
        });
        sortedLines.foreach(new VoidFunction<String>() {
            @Override
            public void call(String s) throws Exception {
                System.out.println(s);
            }
        });
        sc.close();
    }
}

2遭垛、Scala版二次排序
首先定義排序的key

class SecondarySortKey(val first:Int,val second:Int) extends Ordered[SecondarySortKey] with Serializable {
   def compare(that: SecondarySortKey): Int = {
     if(this.first- that.first !=0 ){
       this.first - that.first
     }else{
       this.second -that.second
     }
  }
}

然后實現(xiàn)二次排序

import org.apache.spark.{SparkConf, SparkContext}

object SeconDarySort {

  def main(args: Array[String]): Unit = {
    val inputPath = "D:\\spark\\sortnumber.txt"
    val  conf = new SparkConf()
      .setAppName("SeconDarySort")
      .setMaster("local")
    val sc = new SparkContext(conf)
    val lines =sc.textFile(inputPath,1)
    val pairs = lines.map(line =>
      (new SecondarySortKey(line.split(" ")(0).toInt,line.split(" ")(1).toInt),line))
    val sortedPairs = pairs.sortByKey()
    val sortedList = sortedPairs.map(_._2)
    sortedList.foreach(println)
  }
}

排序結(jié)果一樣:

1 3
1 5
2 1
2 4

2 6
3 1
3 6
3 7

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尼桶,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子耻卡,更是在濱河造成了極大的恐慌疯汁,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卵酪,死亡現(xiàn)場離奇詭異幌蚊,居然都是意外死亡,警方通過查閱死者的電腦和手機溃卡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門溢豆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瘸羡,你說我怎么就攤上這事漩仙。” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵队他,是天一觀的道長卷仑。 經(jīng)常有香客問我,道長麸折,這世上最難降的妖魔是什么锡凝? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮垢啼,結(jié)果婚禮上窜锯,老公的妹妹穿的比我還像新娘。我一直安慰自己芭析,他們只是感情好锚扎,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著馁启,像睡著了一般驾孔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上进统,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天助币,我揣著相機與錄音,去河邊找鬼螟碎。 笑死眉菱,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的掉分。 我是一名探鬼主播俭缓,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酥郭!你這毒婦竟也來了华坦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤不从,失蹤者是張志新(化名)和其女友劉穎惜姐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椿息,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡歹袁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寝优。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片条舔。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乏矾,靈堂內(nèi)的尸體忽然破棺而出孟抗,到底是詐尸還是另有隱情迁杨,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布凄硼,位于F島的核電站铅协,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏摊沉。R本人自食惡果不足惜警医,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望坯钦。 院中可真熱鬧,春花似錦侈玄、人聲如沸婉刀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽突颊。三九已至,卻和暖如春潘悼,著一層夾襖步出監(jiān)牢的瞬間律秃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工治唤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棒动,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓宾添,卻偏偏與公主長得像船惨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缕陕,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,245評論 0 2
  • 排序的基本概念 在計算機程序開發(fā)過程中粱锐,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個關(guān)鍵字進行排序,排序完成的序列可用于快...
    Jack921閱讀 1,421評論 1 4
  • 沒有駛向遠方的輪船 就用軀體做前行的木筏 雙槳長出知更鳥的翅膀 河流鋪平鯨魚的道路 胸膛里的一千只火把 在沒有星光...
    黃英雄閱讀 252評論 0 3
  • 榮故事:鉆石戒指 結(jié)婚的時候扛邑,老公帶我到銀座買了六福的首飾怜浅,選中了一顆鉆石。他選的我不喜歡蔬崩,我又選了一顆大一點的鉆...
    寇榮2020閱讀 174評論 0 0
  • 沒有寶寶喜歡一生氣就開始大吼大叫的爸媽舱殿,有研究表明父母的情緒越是穩(wěn)定孩子越具有幸福感和安全感奥裸。反之,則是對孩子的傷...
    孫老師說閱讀 433評論 0 0