首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排序星火中的可迭代值

排序星火中的可迭代值
EN

Stack Overflow用户
提问于 2015-01-07 17:41:07
回答 1查看 5.2K关注 0票数 5

假设我有这个输入数据:

代码语言:javascript
复制
["example.com", Date(2000, 1, 1)] : 100,
["example.com", Date(2000, 2, 1)]: 30,
["example.com", Date(2000, 3, 1)]: 5, 
["xyz.com", Date(2000, 1, 1)]: 20,
["xyz.com", Date(2000, 2, 1)]: 10,
["xyz.com", Date(2000, 3, 1)]: 60]

我想按日期分组(降序),然后按计数排序,给出每个日期域的有序列表。

最后我想:

代码语言:javascript
复制
Date(2000, 1, 1), [["example.com", 100], ["xyz.com", 20]]
Date(2000, 2, 1), [["example.com", 30], ["xyz.com", 10]]
Date(2000, 3, 1), [["xyz.com", 60], ["example.com", 5]]

这似乎是一个正常的用例,但我无法从编程指南中找到这样做的方法。

我可以map [[domain, date] count] -> [date, [domain, count]]

这会给我(K, V)

代码语言:javascript
复制
Date(2000, 1, 1), ["example.com", 100],
Date(2000, 2, 1), ["example.com", 30],
Date(2000, 3, 1), ["example.com", 5], 
Date(2000, 1, 1), ["xyz.com", 20],
Date(2000, 2, 1), ["xyz.com", 10],
Date(2000, 3, 1), ["xyz.com", 60]

然后groupByKey,给我(K, Iterable<V>)

代码语言:javascript
复制
[Date(2000, 1, 1), [["example.com", 100], ["xyz.com", 20]]
[Date(2000, 2, 1), [["example.com", 30], ["xyz.com", 10]]
[Date(2000, 3, 1), [["example.com", 5], ["xyz.com", 60]]

那我怎么才能在钥匙里排序呢?

请原谅我的伪代码,我使用的是Flambo Clojure包装器,我不想用Java重写它仅仅是为了问这个问题!

编辑:每个Iterable (即域列表)可能太大,无法在内存中使用。

EDIT2:,这都是psuedocode。我使用月份名称来使其可读性,但为了清晰起见,我已经将其更改为真正的日期。

EN

回答 1

Stack Overflow用户

发布于 2015-01-08 11:13:28

泛泛地说,我会做以下几件事。(可能不是100%的正确,因为我没有编译它,但是已经接近了。)为了简单起见,我假设您从RDD[((String,String),Int)]开始。

首先,使用类似于以下内容的月份groupBy

代码语言:javascript
复制
.groupBy { case ((_, month), _) => month }

然后去掉值中的月份:

代码语言:javascript
复制
.mapValues(_.map { case ((domain, _), count) => (domain, count) })

如果希望按月排序,请定义月份的排序:

代码语言:javascript
复制
def monthOfYear(month: String): Int = 
  month match {
     case "January" => 1
     case "February" => 2
     ...
  }

并按月对RDD进行排序:

代码语言:javascript
复制
.sortBy { case (month, _) => monthOfYear(month) }

并按递减计数对域进行排序:

代码语言:javascript
复制
.mapValues(_.toSeq.sortBy{ case (domain, count) => count }(Ordering[Int].reverse))

这是直接和有效的,但有一个问题,所有域计数对一个月必须适合内存。

相反,您可以通过按计数降序排序来重新开始:

代码语言:javascript
复制
.sortBy(p => p._2, false)

然后按月分组。我还没有对此进行测试,我也不认为这种行为是有保证的,但我希望在实践中,即使在分组之后,也会按顺序遇到元素。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27825324

复制
相关文章

相似问题

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