Spark的二次排序

scala版本

  (1)输入与输出

  Spark的二次排序_第1张图片

 

  (2)需求:数据如file1.txt,要求根据第一列降序,如果第一列相等,则根据第二列升序

    分析:平时所使用的键值对是不具有比较意义的,也就说他们没法拿来直接比较,可以通过sortByKey,sortBy(pair._2)来进行单列的排序,但是没法进行两列的同时排序。可以自定义一个键值对的比较类来实现比较,类似于JAVA中自定义类实现可比较性实现comparable接口。我们需要继承Ordered和Serializable特质来实现自定义的比较类。

  (3)解答:先根据key进行排序,相同再根据value进行排序。可以把键值对当成一个数据有两个数字,先通过第一个数字比大小,再通过第二个数字比大小。

    1)我们定义两个Int参数的比较类
    2)继承Ordered 和 Serializable 接口 实现 compare 方法实现可以比较

  (4)代码如下:

package SparkDemo
import org.apache.spark.{SparkConf, SparkContext}
class UDFSort (val first:Int,val second:Int) extends Ordered[UDFSort] with Serializable {//自定义比较类
    override def compare(that: UDFSort): Int = {
        if(this.first - that.first != 0){//第一个值不相等的时候,直接返回大小
            this.first - that.first //返回值
        }
        else {//第一个值相等的时候,比较第二个值
            this.second - that.second
        }
    }
}
object Sort{
    def main(args:Array[String]): Unit ={
        //初始化配置:设置主机名和程序主类的名字
        val conf = new SparkConf().setAppName("UdfSort");
        //通过conf来创建sparkcontext
        val sc = new SparkContext(conf);
        val lines = sc.textFile("file:///...")
        //转换为( udfsort( line(0),line(1) ),line ) 的形式
        val pair = lines.map(line => (new UDFSort(line.split(" ")(0).toInt,line.split(" ")(1).toInt),line))
        //对key进行排序,然后取value
        val result = pair.sortByKey().map( x => x._2)
    }
}
secondSort

Java版本

你可能感兴趣的:(Spark的二次排序)