我有一个案例类(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)]
我的问题:
答案 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