2015-10-13 28 views
5

Jeśli mam RDD krotek z 5 elementów, np RDD (dwukrotnie, String, int, podwójne, podwójne)Jak posortować RDD krotek z 5 elementów w Spark Scala?

Jak mogę rozwiązać ten RDD efektywne wykorzystanie piąty element?

Próbowałem zmapować ten RDD na pary klucz-wartość i użyłem sortByKey, ale wygląda na to, że sortByKey jest dość powolny, jest wolniejszy niż ten zbiór RDD i użyty sortWith w zebranej tablicy. Dlaczego tak jest?

Dziękuję bardzo.

+2

"jest wolniejszy, niż ja zebrałem ten RDD i użyłem sortWith w pobranej tablicy." Oczywiście, że jest. Jeśli zebrać to wszystko znajduje się w jednym węźle, a ty wtedy robi rodzaj Spark w pamięci jest dla dużych zbiorów danych, które nie mieszczą się na jednym węźle, a tam (znaczny) narzut w porównaniu do obliczeń pojedynczego węzła. Jeśli nie masz tak dużego zestawu danych, prawdopodobnie nie chcesz używać Sparka. To nie jest magiczne rozwiązanie "twórz rzeczy szybciej". –

+0

Dziękuję za wyjaśnienia. – Carter

Odpowiedz

8

Można to zrobić z sortBy działając bezpośrednio na RDD:

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

Istnieją dodatkowe opcjonalne parametry definiujące porządek („rosnąco”) oraz liczbę partycji.

+0

Dzięki za odpowiedź. Próbowałem SortBy na moim RDD, ale zwraca błąd: wartość SortBy nie jest członkiem org.apache.spark.rdd.RDD [(double, string, int, podwójne, podwójne)]. Używam Spark 1.0.1, czy to jest powód? – Carter

+1

Wygląda na to może być - 'sortBy' wydaje sięgają Spark wersjach 1.1.x – Shadowlands

+0

dzięki za odpowiedź. – Carter

1

sortByKey jest rozprowadzane tylko sortowania API iskry 1.0.

Ile danych starasz się rozwiązać? Mała ilość spowoduje szybsze sortowanie lokalne/scentralizowane. Jeśli spróbujesz posortować GB i GB danych, które nie mieszczą się w jednym węźle, to właśnie tam świeci Spark.

+1

Dzięki. Dane, które sortuję, nie są zbyt duże i mogą być obsługiwane w pamięci. Może powinienem posortować dane jako tablicę/listę zamiast RDD. – Carter

1

Jeśli chcesz sortować według malejącej kolejności , jeśli odpowiedni element jest typu int, możesz użyć znaku "-" do sortowania RDD w porządku malejącym.

Dla ex:

Mam RDD z krotki z (String, int). Aby rozwiązać ten RDD przez jej 2-ej w porządku malejącym,

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

Mam RDD z krotki z (String, String). Aby posortować ten RDD według jego drugiego elementu w porządku malejącym,

rdd.sortBy(x => x._2, false).collect().foreach(println); 
Powiązane problemy