如何对三元组RDD火花进行排序和分组

时间:2016-02-22 01:20:08

标签: scala sorting apache-spark rdd

我的数据集如下:

+-----------+-----------+----------+
| property1 | property2 | distance |
+-----------+-----------+----------+
|        1  |         1 |   0      |
|        1  |         2 |  .3      |
|        1  |         3 |  .1      |
|        2  |         1 |  .3      |
|        2  |         2 |   0      |
|        2  |         3 |  .1      |
|        3  |         1 |  .1      |
|        3  |         2 |  .1      |
|        3  |         3 |   0      |
+-----------+-----------+----------+

我需要按property1对此进行分组,然后按distance对其进行排序。该数据集目前为RDD"结果"。我写了这段代码

val resultset = results.map{ case (subjectid, compid, distance) => (subjectid, compid, distance.toDouble)}
val groupedBySubjectComps = resultset.groupBy(_._1)
val sortedCompsBySubjectComps = groupedBySubjectComps mapValues { triples =>
  val sortedTriples = triples.sortBy(_._3) 
  val keepOnlyComps = sortedTriples.map(_._2)
  keepOnlyComps
}

sortBy有错误。它说sortBy不是Iterable的成员

我做错了什么?

1 个答案:

答案 0 :(得分:0)

triplesIterator,不是集合。根据Scala文档,Iterator没有sortBy方法(这是有道理的,因为迭代器更像是刚刚流过的数据流。考虑尝试类似的东西:

val sortedTriples = triples.toArray.sortBy(_._3)

将其更改为可以分类的集合。