2014-11-17 3 views
9

Ich habe ein Funke Paar RDD (Schlüssel, zählt) wie untenSortieren nach Wert in Funkenpaar RDD

Array[(String, Int)] = Array((a,1), (b,2), (c,1), (d,3)) 

Mit Funken scala API wie ein neues Paar RDD zu erhalten, die nach Wert sortiert wird?

Required Ergebnis: Array((d,3), (b,2), (a,1), (c,1))

+0

Könnte es Wiederholungen in den Werten sein? Falls nicht: tausche die Schlüssel und Werte aus und sortiere nach Schlüssel, wechsle zurück. –

+0

Ja, Werte werden wiederholt. –

Antwort

27

Dies sollte funktionieren:

//Assuming the pair's second type has an Ordering, which is the case for Int 
rdd.sortBy(_._2) // same as rdd.sortBy(pair => pair._2) 

(Auch wenn Sie den Schlüssel nehmen möchten vielleicht auch zu berücksichtigen, wenn es Verbindungen.)

+0

Hallo @ GáborBakos, ich habe eine Map wie diese erstellt - 'val b = a.map (x => (x (0), x))' Hier ist 'b' vom Typ' org.apache.spark.rdd '. RDD [(Any, org.apache.spark.sql.Row)] 'Wenn ich' b.sortBy (_._ 2) 'versuche, funktioniert es nicht. Gibt es eine Diskussion darüber, wie man _ –

+0

Hi @ SumitKumarGhosh verwendet, scheint dies eine andere Frage. Ich denke, Sie müssen eine 'Bestellung' für Ihre [' org.apache.spark.sql.Row'] definieren (https://spark.apache.org/docs/1.3.1/api/scala/index.html#). org.apache.spark.sql.Row) type, da es nicht 'Ordered' ist. Wenn Sie eine neue Frage erstellen, fügen Sie bitte auch die Fehlermeldung hinzu. Das '_' ist nur ein syntaktischer Zucker für folgendes:' aVariable => aVariable', also '_._ 2' könnte auch so geschrieben worden sein:' pair => pair._2'. –

+0

[link] (http://stackoverflow.com/questions/30469864/order-by-value-in-spark-pairrdd-from-key-value-where-the-value-is-from-spark-s) –

5

Sortieren nach Schlüssel und Wert in auf- und absteigender Reihenfolge

val textfile = sc.textFile("file:///home/hdfs/input.txt") 
val words = textfile.flatMap(line => line.split(" ")) 
//Sort by value in descending order. For ascending order remove 'false' argument from sortBy 
words.map(word => (word,1)).reduceByKey((a,b) => a+b).sortBy(_._2,false) 
//for ascending order by value 
words.map(word => (word,1)).reduceByKey((a,b) => a+b).sortBy(_._2) 

//Sort by key in ascending order 
words.map(word => (word,1)).reduceByKey((a,b) => a+b).sortByKey 
//Sort by key in descending order 
words.map(word => (word,1)).reduceByKey((a,b) => a+b).sortByKey(false) 

Dies kann b e in einer anderen Art und Weise getan, indem sortByKey Anwendung nach dem Schlüssel-Wert-Swapping

//Sort By value by swapping key and value and then using sortByKey 
val sortbyvalue = words.map(word => (word,1)).reduceByKey((a,b) => a+b) 
val descendingSortByvalue = sortbyvalue.sortByKey(false).map(x => (x._2,x._1)) 
descendingSortByvalue.toDF.show 
descendingSortByvalue.foreach {n => { 
val word= n._1 
val count = n._2 
println(s"$word:$count")}} 
+0

sehr gute detaillierte Beispiele –

+0

Danke Vijay Innamuri –