web-dev-qa-db-ja.com

RDDをソートする方法

私はscoreTripletsが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()を使用せずにRDDをscoreでソートする必要があります。
scoreTriplesはRDD [ARRAY [String]]です。RDDの各行には、以下の変数の配列が格納されます。
EdgeId sourceID destID score sourceNAmedestNAme距離

参考資料やヒントを教えてください。

7

並べ替えは、シャッフルのため、収集しなくてもコストのかかる操作になりますが、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))
9
zero323

RDDにはsortByメソッドがあります( doc を参照)。あなたはそのようなことをすることができます

scoreTriplets.sortBy( _(3).toInt )
3
ponkin