我有一个案例类(TopNModel)的RDD,并且希望从通过tx + rx排序的RDD中获得顶级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)]我的问题是:
发布于 2017-12-04 19:12:17
编辑:下面的重要评论是,如果确实需要基于这个顺序获得“顶级N”实体,那么sortBy与takeOrdered相比是浪费的。与takeOrdered一起使用第二个解决方案("alternative")。
您可以使用元组从“最左边”参数到右边的自然排序,并创建一个具有tx + rx负值的元组(使这些元组按递减顺序排序)和mac的正值。
val result = rdd.sortBy { case TopNModel(mac, tx, rx) => (-(tx + rx), mac) }Alternatively,--如果您希望TopNModel总是以这种方式排序(无论上下文如何),您可以使其成为Ordered并实现其compare方法。然后,按标识进行排序将使用该compare获得相同的结果:
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)https://stackoverflow.com/questions/47640198
复制相似问题