首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对RDD进行排序,并使用scala获取顶级N元素?

如何对RDD进行排序,并使用scala获取顶级N元素?
EN

Stack Overflow用户
提问于 2017-12-04 19:02:15
回答 1查看 723关注 0票数 0

我有一个案例类(TopNModel)的RDD,并且希望从通过tx + rx排序的RDD中获得顶级N个元素。在两个相等(tx + rx)按mac排序的情况下。

代码语言:javascript
复制
case class TopNModel(mac: Long, tx: Int, rx: Int)

例如:

代码语言:javascript
复制
RDD[TopNModel(10L, 200, 100), TopNModel(12L, 100, 100), TopNModel(1L, 200, 400), TopNModel(11L, 100, 200)]

按tx + rx和mac进行排序:

代码语言:javascript
复制
RDD[TopNModel(1L, 200, 400), TopNModel(10L, 200, 100), TopNModel(11L, 100, 200), TopNModel(12L, 100, 100)]

我的问题是:

  1. 如果rx + tx值相同,那么如何排序?
EN

回答 1

Stack Overflow用户

发布于 2017-12-04 19:12:17

编辑:下面的重要评论是,如果确实需要基于这个顺序获得“顶级N”实体,那么sortBytakeOrdered相比是浪费的。与takeOrdered一起使用第二个解决方案("alternative")。

您可以使用元组从“最左边”参数到右边的自然排序,并创建一个具有tx + rx负值的元组(使这些元组按递减顺序排序)和mac的正值。

代码语言:javascript
复制
val result = rdd.sortBy { case TopNModel(mac, tx, rx) => (-(tx + rx), mac) }

Alternatively,--如果您希望TopNModel总是以这种方式排序(无论上下文如何),您可以使其成为Ordered并实现其compare方法。然后,按标识进行排序将使用该compare获得相同的结果:

代码语言:javascript
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47640198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档