Próbuję wydrukować zawartość kolekcji do konsoli Spark.
Mam typ:
linesWithSessionId: org.apache.spark.rdd.RDD[String] = FilteredRDD[3]
I używam polecenia:
scala> linesWithSessionId.map(line => println(line))
Ale to jest drukowane:
res1: org.apache.spark.rdd.RDD [Unit] = zmapowanyRDD [4] na mapie w: 19
Jak mogę napisać RDD na konsoli lub zapisać go na dysku, aby móc przeglądać jego zawartość?
scala
apache-spark
niebieskie niebo
źródło
źródło
show
metody.Odpowiedzi:
Jeśli chcesz wyświetlić zawartość RDD, jednym ze sposobów jest użycie
collect()
:Nie jest to jednak dobry pomysł, skoro RDD ma miliardy linii. Użyj,
take()
aby wydrukować tylko kilka:źródło
saveAsTextFile
na RDD, jest to, że muszę zapisać zawartość RDD w więcej niż jednym pliku, dlatego używamforeach
Ta
map
funkcja jest transformacją , co oznacza, że Spark nie oceni twojego RDD, dopóki nie wykonasz na nim akcji .Aby go wydrukować, możesz użyć
foreach
(co jest akcją):Aby zapisać go na dysku, możesz użyć jednej z
saveAs...
funkcji (nadal działań) z RDD APIźródło
collect
żeby RDD można było wydrukować w konsoli.foreach
sam najpierw "zmaterializuje" RDD, a następnie uruchomi sięprintln
na każdym elemencie, więccollect
nie jest tu naprawdę potrzebny (chociaż możesz go oczywiście użyć) ...foreach
działa dobrze. Jeśli uruchamiasz zadanie w klastrze i chcesz wydrukować swoje rdd, powinieneścollect
(jak wskazują inne komentarze i odpowiedzi), aby zostało wysłane do sterownika przedprintln
wykonaniem. Używanietake
zgodnie z sugestią Oussamy może być dobrym pomysłem, jeśli twój RDD jest zbyt duży.Jeśli uruchamiasz to w klastrze
println
, nie drukujesz z powrotem do twojego kontekstu. Musisz przynieśćRDD
dane do swojej sesji. Aby to zrobić, możesz zmusić go do lokalnej tablicy, a następnie wydrukować:źródło
Można konwertować
RDD
DoDataFrame
potemshow()
ona.Spowoduje to wyświetlenie 20 pierwszych wierszy danych, więc rozmiar danych nie powinien stanowić problemu.
źródło
import spark.implicits._
toDF
anispark.implicits._
w zakresie iskier.Prawdopodobnie istnieje wiele różnic architektonicznych pomiędzy
myRDD.foreach(println)
imyRDD.collect().foreach(println)
(nie tylko „zbieraj”, ale także inne działania). Jedną z różnic, które zauważyłem, jest tomyRDD.foreach(println)
, że dane wyjściowe będą w losowej kolejności. Na przykład: jeśli mój rdd pochodzi z pliku tekstowego, w którym każda linia ma numer, dane wyjściowe będą miały inną kolejność. Ale kiedy to zrobiłemmyRDD.collect().foreach(println)
, porządek pozostaje taki, jak plik tekstowy.źródło
W Pythonie
Spowoduje to wydrukowanie całej zawartości RDD
źródło
a nowsza wersja Spark ładnie pokaże tabelę.
źródło
Zamiast wpisywać za każdym razem, możesz;
[1] Utwórz ogólną metodę drukowania wewnątrz Spark Shell.
[2] Lub nawet lepiej, używając implicits, możesz dodać funkcję do klasy RDD, aby wydrukować jej zawartość.
Przykładowe użycie:
Wynik:
Ważny
Ma to sens tylko wtedy, gdy pracujesz w trybie lokalnym i z małą ilością zestawu danych. W przeciwnym razie albo nie będzie można zobaczyć wyników na kliencie, albo zabraknie pamięci z powodu wyniku dużego zbioru danych.
źródło
Możesz również zapisać jako plik:
rdd.saveAsTextFile("alicia.txt")
źródło
W składni java:
źródło