如何使用scala对RDD进行排序并获得前N个元素?
我有一个case类(TopNModel)的RDD,希望通过按tx+rx进行排序得到前N个元素。 在两个相等(tx+rx)的情况下,按mac排序如何使用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 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)]
我的问题:
编辑:根据下面的重要评论,如果确实需要基于此订单“获得前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
是正确的方法