如何对RDD

时间:2015-11-18 08:17:03

标签: scala sorting apache-spark rdd

我得分Triplets是RDD [ARRAY [String]],我按照以下方式排序。

var ScoreTripletsArray = scoreTriplets.collect()
  if (ScoreTripletsArray.size > 0) {        
    /*Sort the ScoreTripletsArray descending by score field*/        
    scala.util.Sorting.stableSort(ScoreTripletsArray, (e1: Array[String], e2: Array[String]) => e1(3).toInt > e2(3).toInt)
}

但是如果缺少元素,那么collect()会很重。

所以我需要在不使用collect()的情况下按score对RDD进行排序 scoreTriples是RDD [ARRAY [String]] RDD的每一行都将存储以下变量的数组 EdgeId sourceID destID score sourceNAme destNAme distance

请给我任何参考或提示。

2 个答案:

答案 0 :(得分:8)

由于改组,即使没有收集也会进行昂贵的操作排序,但您可以使用sortBy方法:

import scala.util.Random

val data = Seq.fill(10)(Array.fill(3)("") :+ Random.nextInt.toString)
val rdd  = sc.parallelize(data)

val sorted = rdd.sortBy(_.apply(3).toInt)
sorted.take(3)
// Array[Array[String]] = Array(
//   Array("", "", "", -1660860558),
//   Array("", "", "", -1643214719),
//   Array("", "", "", -1206834289))

如果您只对最佳结果感兴趣,则toptakeOrdered通常是首选。

import scala.math.Ordering

rdd.takeOrdered(2)(Ordering.by[Array[String], Int](_.apply(3).toInt))
// Array[Array[String]] = 
//   Array(Array("", "", "", -1660860558), Array("", "", "", -1643214719))

rdd.top(2)(Ordering.by[Array[String], Int](_.apply(3).toInt))
// Array[Array[String]] = 
//   Array(Array("", "", "", 1920955686), Array("", "", "", 1597012602))

答案 1 :(得分:3)

RDD中有sortBy方法(参见doc)。 你可以做那样的事情

scoreTriplets.sortBy( _(3).toInt )