2015-05-15 14 views
21

Chciałbym wyświetlić całą SQL DataFrame Apache Spark z interfejsem API Scala. Mogę użyć metody show():Czy istnieje lepszy sposób wyświetlania całego DataFrame SQL klasy Spark?

myDataFrame.show(Int.MaxValue) 

Czy istnieje lepszy sposób, aby wyświetlić całą DataFrame niż używanie Int.MaxValue?

+1

Wypróbuj 'myDataFrame.show (false)'. Nie jestem pewien, czy to jest to, czego szukasz. – Pramit

+0

Użyj RDD.toLocalIterator(), jak opisano w tym poście SO: http://stackoverflow.com/questions/21698443/spark-best-practice-for-retrieving-big-data-od-rdd-to-local-machine –

Odpowiedz

37

To generalnie nie jest wskazane, aby wyświetlić całą DataFrame na standardowe wyjście, bo to oznacza, że ​​trzeba wyciągnąć całą DataFrame (wszystkich jego wartości) do sterownika (chyba DataFrame jest już lokalne, które można sprawdzić z df.isLocal) .

Jeśli nie wiesz przed czasem, że rozmiar zbioru danych jest wystarczająco mały, aby proces JVM sterownika miał wystarczającą ilość pamięci, aby pomieścić wszystkie wartości, nie jest to bezpieczne. Właśnie dlatego domyślnie DataFrame API show() wyświetla tylko pierwsze 20 wierszy.

można użyć df.collect która zwraca Array[T] a następnie iteracyjne nad każdej linii i wydrukować go:

df.collect.foreach(println) 

ale tracisz wszystko formatowanie realizowane w df.showString(numRows: Int) (to show() używa wewnętrznie).

Więc nie, myślę, że nie ma lepszego sposobu.

+0

Dzięki za szczegółową odpowiedź! –

+0

Nie ma za co :) –

+0

'df.toJSON.collect.foreach (println)' jest lepszy –

0

Nic prostszego, ale jeśli chcesz uniknąć Int.MaxValue, możesz użyć collect i przetworzyć go, lub foreach. Ale w przypadku formatu tabelarycznego bez dużego kodu ręcznego, najlepszą możliwą czynnością jest show.

2

Jak sugerowali inni, wydrukowanie całego DF jest złym pomysłem. Jednakże, można użyć df.rdd.foreachPartition(f) wydrukować partycję-by-partycji bez zalania sterownika JVM (y korzystając zbieranie)

+0

Czy możesz podać przykładowy kod? Czy instrukcje print wewnątrz funkcji 'f()' nie będą drukowane na standardowe wyjście pracowników, a nie na standardowe wyjście sterownika/powłoki? Zobacz także http://stackoverflow.com/a/28804763/215945 –

-2

Próbowałem show() i wydaje pracuje czasami. Ale czasami nie działa, tylko spróbować:

println(df.show()) 
+5

dr.show() zwraca void not String. – Bradjcox

+0

Domyślnie pokazuje tylko 20 najlepszych wierszy –

1

W java próbowałem go z dwóch sposobów. to działa idealnie dla mnie:

1.

data.show(SomeNo); 

2.

data.foreach(new ForeachFunction<Row>() { 
       public void call(Row arg0) throws Exception { 
        System.out.println(arg0); 
       } 
      }); 
2

Jednym ze sposobów jest użycie count() funkcję, aby uzyskać całkowitą liczbę rekordów i używać show(rdd.count()) .

Powiązane problemy