如何使用scala对RDD进行排序并获得前N个元素?

如何使用scala对RDD进行排序并获得前N个元素?,scala,apache-spark,Scala,Apache Spark,我有一个case类(TopNModel)的RDD,希望通过按tx+rx进行排序得到前N个元素。 在两个相等(tx+rx)的情况下,按mac排序 case class TopNModel(mac: Long, tx: Int, rx: Int) 例如: RDD[TopNModel(10L, 200, 100), TopNModel(12L, 100, 100), TopNModel(1L, 200, 400), TopNModel(11L, 100, 200)] 按tx+rx和mac排序: R

我有一个case类(TopNModel)的RDD,希望通过按tx+rx进行排序得到前N个元素。 在两个相等(tx+rx)的情况下,按mac排序

case class TopNModel(mac: Long, tx: Int, rx: Int)
例如:

RDD[TopNModel(10L, 200, 100), TopNModel(12L, 100, 100), TopNModel(1L, 200, 400), TopNModel(11L, 100, 200)]
按tx+rx和mac排序:

RDD[TopNModel(1L, 200, 400), TopNModel(10L, 200, 100), TopNModel(11L, 100, 200), TopNModel(12L, 100, 100)]
我的问题:

  • 如果rx+tx值相同,如何排序,然后根据mac进行排序

  • 编辑:根据下面的重要评论,如果确实需要基于此订单“获得前N名”实体,
    sortBy
    takeOrdered
    相比是浪费。将第二种解决方案(“备选方案”)与
    takeOrdered
    一起使用


    您可以使用这样一个事实,即元组自然地从“最左边”的参数向右排序,并创建一个具有负值
    tx+rx
    (以便按降序排序)和正值
    mac

    val result = rdd.sortBy { case TopNModel(mac, tx, rx) => (-(tx + rx), mac) }
    
    或者,如果希望始终以这种方式对
    TopNModel
    进行排序(无论上下文如何),可以将其设置为
    有序的
    ,并实现其
    比较
    方法。然后,按标识排序将使用
    比较
    得到相同的结果:

    case class TopNModel(mac: Long, tx: Int, rx: Int) extends Ordered[TopNModel] {
      import scala.math.Ordered.orderingToOrdered
      def compare(that: TopNModel): Int = (-(tx + rx), mac) compare (-(that.tx + that.rx), that.mac)
    }
    
    val result = rdd.sortBy(identity)
    

    编辑:根据下面的重要评论,如果确实需要基于此订单“获得前N名”实体,
    sortBy
    takeOrdered
    相比是浪费。将第二种解决方案(“备选方案”)与
    takeOrdered
    一起使用


    您可以使用这样一个事实,即元组自然地从“最左边”的参数向右排序,并创建一个具有负值
    tx+rx
    (以便按降序排序)和正值
    mac

    val result = rdd.sortBy { case TopNModel(mac, tx, rx) => (-(tx + rx), mac) }
    
    或者,如果希望始终以这种方式对
    TopNModel
    进行排序(无论上下文如何),可以将其设置为
    有序的
    ,并实现其
    比较
    方法。然后,按标识排序将使用
    比较
    得到相同的结果:

    case class TopNModel(mac: Long, tx: Int, rx: Int) extends Ordered[TopNModel] {
      import scala.math.Ordered.orderingToOrdered
      def compare(that: TopNModel): Int = (-(tx + rx), mac) compare (-(that.tx + that.rx), that.mac)
    }
    
    val result = rdd.sortBy(identity)
    

    同意如何订购,但不要使用sortBy仅获取前N个元素,请参见以下内容:非常好的点@V-Lamp-我不知怎么错过了这一点
    takeOrdered
    是正确的方法,就如何订购达成了一致,但不要使用sortBy只获取前N个元素,请看以下内容:非常好的点@V-Lamp-我不知怎么错过了这一点
    takeOrdered
    是正确的方法