2015-10-13 11 views
5

Wenn ich eine RDD von Tupeln mit 5 Elementen haben, zum Beispiel RDD (Double, String, Int, Double, Double)Wie man eine RDD von Tupeln mit 5 Elementen in Spark Scala sortiert?

Wie kann ich diese RDD sortieren effizient das fünfte Element verwendet?

Ich habe versucht, diese RDD in Schlüssel-Wert-Paare zuordnen und verwendet sortByKey, aber sieht aus wie sortByKey ist ziemlich langsam, es ist langsamer als ich diese RDD gesammelt und sortWith auf dem gesammelten Array verwendet. Warum ist es so?

Vielen Dank.

+2

Natürlich ist es das. Wenn Sie es sammeln, ist alles auf einem Knoten und Sie machen dann eine In-Memory-Sortierung Spark ist für große Datensätze, die nicht auf einen Knoten passen, und es gibt einen (erheblichen) Overhead im Vergleich zur Einzelknotenberechnung. Wenn Sie keinen so großen Datensatz haben, möchten Sie wahrscheinlich Spark nicht verwenden. Es ist keine magische "Lösung schneller machen". –

+0

Vielen Dank für Ihre Erklärung. – Carter

Antwort

8

Sie können dies tun, mit sortBy direkt am RDD wirkende:

myRdd.sortBy(_._5) // Sort by 5th field of each 5-tuple 

Es gibt zusätzliche optionale Parameter Sortierreihenfolge („aufsteigend“) und die Anzahl der Partitionen zu definieren.

+0

Danke für Ihre Antwort. Ich versuchte sortBy auf meiner RDD, aber es gibt einen Fehler zurück: Wert sortBy ist kein Mitglied von org.apache.spark.rdd.RDD [(Double, String, Int, Double, Double)]. Ich benutze Spark 1.0.1, ist das der Grund? – Carter

+1

Sieht aus wie es sein könnte - "sortBy" scheint auf Spark-Versionen 1.1.x zurück zu datieren – Shadowlands

+0

Vielen Dank für Ihre Antwort. – Carter

1

sortByKey ist die einzige verteilte Sortierung API für Spark 1.0.

Wie viele Daten möchten Sie sortieren? Ein geringer Betrag führt zu einer schnelleren lokalen/zentralen Sortierung. Wenn Sie versuchen, GB und GB von Daten zu sortieren, die möglicherweise nicht einmal auf einen einzelnen Knoten passen, dann leuchtet Spark.

+1

Danke. Die Daten, die ich sortiere, sind nicht sehr groß und können im Speicher verarbeitet werden. Vielleicht sollte ich die Daten als Array/Liste und nicht als RDD sortieren. – Carter

1

Wenn Sie nach absteigender Reihenfolge sortieren möchten & Wenn das entsprechende Element vom Typ int ist, können Sie das RDD in absteigender Reihenfolge mit dem Zeichen "-" sortieren.

Für Ex:

Ich habe ein RDD von Tupel mit (String, Int). Um diese RDD nach ihrem zweiten Element in absteigender Reihenfolge zu sortieren, habe ich eine RDD von Tuple mit (String, String)

rdd.sortBy(x => -x._2).collect().foreach(println); 

. Um diese RDD nach ihrem zweiten Element in absteigender Reihenfolge zu sortieren, ist es langsamer als ich diese RDD gesammelt und sortWith für das gesammelte Array verwendet habe.

Verwandte Themen