Spark学习之路(八):分别使用Java与Scala实现Spark二次排序

本文介绍了Spark的二次排序概念,通过Java和Scala两种语言详细讲解如何实现二次排序,包括创建自定义Bean、实现Ordered接口以及排序代码演示。二次排序常用于多维度的数据排序,如商品的多维度热门排序。
摘要由CSDN通过智能技术生成

一、Spark二次排序的概念

  • 排序操作是数据处理过程中的常用操作步骤,Spark提供了诸如sortBy算子和sortByKey算子来实现排序,但是存在一些不足的地方,此类算子只能针对一个排序的依据进行排序,比如说sortByKey算子仅仅只能根据Key来排序,而Key常常只是一个数字或者字符串,现给出这样的一个需求(以下的演示也是围绕这个需求),给出学生数据,里面有数学和语文两门成绩,按数学成绩升序排序,如果数学成绩相同,再按语文成绩升序排序,这里涉及到了同时对两个排序字段进行排序,因而直接使用以上的那些算子是不能实现的,而实际生产中排序字段只会更多甚至10几个,因此就要使用Spark核心编程的较为高阶的技术二次排序了。
  • Spark二次排序本质上是自定义Key来实现排序,使用一个Bean将所有的要排序的字段封装进Bean中,然后在Bean自定义排序规则,最后结合sortBy算子或者sortByKey算子操作自定义的Key即可实现Spark的二次排序。

二、实现二次排序的详细步骤(Java语言)

  • 创建一个JavaBean,将涉及排序的字段封装进JavaBean,中比如说上述需求的数学成绩与语文成绩就是待排序字段,然后为排序字段增添getter和setter方法。
  • 实现Java序列化接口Serializable,因为要被Spark直接引用所以自定义的引用类型都必须序列化,而Spark支持Java的序列化。
  • 实现Ordered接口,其泛型类型就是当前JavaBean。然后重写接口方法:
    (1).大于方法:$greater
    在这里插入图片描述
    (2).大于或等于方法:$greater$eq
    在这里插入图片描述
    (3).小于方法:$less
    在这里插入图片描述
    (4).小于或等于方法:$less$eq
    在这里插入图片描述
    (5).重写compare和compareTo方法
    在这里插入图片描述
    在这里插入图片描述
    实际上,上述5类方法涵盖了两个待比较Key的所有比较结果,Spark会依次调用上述方法,直到产生一个比较结果就会跳出比较。
  • 将自定义的JavaBean作为Key使用sorkByKey算子进行排序,sorkByKey算子会根据我们的自定义排序规则对Key进行排序。

三、二次排序代码演示

1.Java版本
  • 创建类SecondlySortKeyJava,用于封装待排序的字段,并实现Order接口,实现接口方法:
    /**
    * 定义二次排序的key,即实现Ordered接口
    * 另外因为这个Key需要被算子引用所以需要序列化
    * 常见的方法是实现Java的Serializable
    * 或者使用Kryo序列化
    */
    public class SecondlySortKeyJava implements Ordered<SecondlySortKeyJava>, Serializable {
         
    
       private int math;
       private int chinese;
       // 定义有参构造方法
       public SecondlySortKeyJava(int manth, int chinese) {
         
           this.math = manth;
           this.chinese = chinese;
       }
       
       // 定义相等规则
       public int compare(SecondlySortKeyJava other) {
         
           if(this.math - other.math != 0)
               return this.math - other.math;
           else if(this.chinese - other.chinese != 0){
         
               return this.chinese - other.chinese;
           }
           return 0;
       }
       // 定义小于规则
       public boolean $less(SecondlySortKeyJava other) {
         
           if(this.math < other.getManth()){
         
               return true;
           }else if(this.math == other.getManth
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值