2015-10-13 8 views
5

Se ho un RDD di tuple con 5 elementi, per esempio, RDD (Double, String, int, double, double)Come ordinare un RDD di tuple con 5 elementi in Spark Scala?

Come posso risolvere questo RDD efficiente utilizzando il quinto elemento?

Ho provato a mappare questo RDD in coppie chiave-valore e usato sortByKey, ma sembra che sortByKey sia piuttosto lento, è più lento di quanto ho raccolto questo RDD e usato sortWith sull'array raccolto. Perché è così?

Grazie mille.

+2

"è più lento di Ho raccolto questo RDD e usato sortWith sull'array raccolta." Ovviamente è. Se lo raccolgono, tutto è su un nodo e quindi stai facendo un ordinamento in memoria Spark è per dataset di grandi dimensioni che non si adattano a un nodo, e c'è un overhead (considerevole) rispetto al calcolo a nodo singolo. Se non hai un set di dati così grande, probabilmente non vuoi usare Spark. Non è una soluzione magica per "rendere le cose più veloci". –

+0

Grazie per la spiegazione. – Carter

risposta

8

È possibile farlo con sortBy agendo direttamente sul RDD:

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

Non ci sono parametri aggiuntivi opzionali per definire un sistema di classificazione ("ascendente") e il numero di partizioni.

+0

Grazie per la risposta. Ho provato sortBy sul mio RDD, ma restituisce un errore: valore sortBy non è un membro di org.apache.spark.rdd.RDD [(Double, String, Int, Double, Double)]. Sto usando Spark 1.0.1, è questa la ragione? – Carter

+1

Sembra che potrebbe essere - 'sortBy' sembra risalire alle versioni Spark 1.1.x – Shadowlands

+0

Grazie per la risposta. – Carter

1

sortByKey è l'unico ordinamento distribuito API per Spark 1.0.

Quanti dati stai cercando di ordinare? Una piccola quantità comporterà un ordinamento locale/centralizzato più veloce. Se provi a ordinare GB e GB di dati che potrebbero non adattarsi nemmeno su un singolo nodo, è qui che Spark brilla.

+1

Grazie. I dati che ho ordinato non sono molto grandi e possono essere gestiti in memoria. Forse dovrei ordinare i dati come una matrice/lista piuttosto che un RDD. – Carter

1

Se si desidera ordinare in ordine decrescente & se l'elemento corrispondente è di tipo int, è possibile utilizzare il segno "-" per ordinare l'RDD in ordine discendente.

Per esempio:

Ho un RDD di tupla con (String, Int). Per ordinare questo RDD dal suo secondo elemento in ordine decrescente,

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

Ho un RDD di tupla con (String, String). Per ordinare questa RDD dal suo 2 ° elemento in ordine decrescente,

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