【问题标题】:How to sort the RDD and get top N elements using scala?如何使用scala对RDD进行排序并获得前N个元素?
【发布时间】:2017-12-05 22:00:06
【问题描述】:

我有一个案例类 (TopNModel) 的 RDD,并希望通过提供 RDD 来获取前 N 个元素,其中按 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排序?

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    编辑:根据下面的重要评论,如果确实要求根据此顺序“获得前 N 个”实体,则 sortBy 与 takeOrdered 相比是浪费的。使用带有takeOrdered 的第二种解决方案(“替代方案”)。


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

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

    或者,如果您希望TopNModel始终以这种方式排序(无论上下文如何),您可以将其设为Ordered 并实现其@ 987654330@ 方法。然后,按身份排序将使用 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)
    

    【讨论】:

    • 同意如何排序,但不要使用 sortBy 只取前 N 个元素,请参见:stackoverflow.com/questions/31882221/…
    • 非常好的观点@V-Lamp - 我不知何故错过了这一点。 takeOrdered 是正确的方法
    猜你喜欢
    • 2015-08-23
    • 1970-01-01
    • 2019-04-10
    • 2015-08-23
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    相关资源
    最近更新 更多