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

时间:2017-12-04 19:02:16

标签: scala apache-spark

我有一个案例类(TopNModel)的RDD,并希望得到前N个元素给RDD,其中按tx + rx排序。 如果两个相等(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)]

我的问题:

  1. 如果rx + tx值相同然后基于mac进行排序,如何排序?

1 个答案:

答案 0 :(得分:2)

编辑:根据下面的重要评论,如果确实要求是"获得最高N"与sortBy相比,基于此订单的实体takeOrdered是浪费的。将第二个解决方案("替代")与takeOrdered一起使用。

您可以使用元组从"最左边"自然排序的事实。右边的参数,并创建一个负值为tx + rx的元组(以便它们按降序排序)和mac的正值:

val result = rdd.sortBy { case TopNModel(mac, tx, rx) => (-(tx + rx), mac) }

或者,如果您希望<{1}} 总是以这种方式排序(无论上下文),您可以将其设为TopNModel并实现其Ordered方法。然后,按身份排序将使用compare来获得相同的结果:

compare