2015-05-15 9 views
21

Vorrei visualizzare l'intero Apache Spark SQL DataFrame con l'API Scala. Posso utilizzare il metodo show():C'è un modo migliore per visualizzare l'intero Spark SQL DataFrame?

myDataFrame.show(Int.MaxValue) 

C'è un modo migliore per visualizzare un intero dataframe che usare Int.MaxValue?

+1

Prova 'myDataFrame.show (false)'. Non sono sicuro se questo è quello che stai cercando. – Pramit

+0

Usa RDD.toLocalIterator(), come discusso in questo post SO: http://stackoverflow.com/questions/21698443/spark-best-practice-for-retrieving-big-data-from-rdd-to-local-machine –

risposta

37

Generalmente non è consigliabile visualizzare un intero dataframe stdout, perché significa che è necessario tirare l'intero dataframe (tutti i suoi valori) per il conducente (a meno che non DataFrame è già locale, che è possibile controllare con df.isLocal) .

A meno che non si sappia in anticipo che la dimensione del set di dati è sufficientemente piccola in modo che il processo JVM del driver abbia memoria sufficiente per accogliere tutti i valori, non è sicuro farlo. Ecco perché l'API di DataFrame show() per impostazione predefinita mostra solo le prime 20 righe.

È possibile utilizzare il df.collect che restituisce Array[T] e poi iterare su ogni linea e stamparlo:

df.collect.foreach(println) 

ma si perde tutta la formattazione implementato in df.showString(numRows: Int) (che show() utilizza internamente).

Quindi no, immagino che non ci sia un modo migliore.

+0

Grazie per la risposta dettagliata! –

+0

Prego :) –

+0

'df.toJSON.collect.foreach (println)' è meglio –

0

Niente di più succinta di quella, ma se si vuole evitare la Int.MaxValue, allora si potrebbe utilizzare un collect e di processo che, o foreach. Ma, per un formato tabellare senza molto codice manuale, show è il meglio che puoi fare.

2

Come altri hanno suggerito, la stampa dell'intero DF è una cattiva idea. Tuttavia, è possibile utilizzare df.rdd.foreachPartition(f) stampare partizione-by-partizione senza inondare conducente JVM (y usando Collect)

+0

Potete fornire qualche codice di esempio? Le istruzioni print all'interno della funzione 'f()' non verranno stampate sullo stdout dei worker e non sul driver/stdout della sessione shell? Vedi anche http://stackoverflow.com/a/28804763/215945 –

-2

Ho provato show() e sembra lavorare a volte. Ma a volte non funziona, basta fare un tentativo:

println(df.show()) 
+5

dr.show() restituisce void non String. – Bradjcox

+0

Per impostazione predefinita, mostra solo le prime 20 righe –

1

In java ho provato con due modi. Questo sta funzionando perfettamente per me:

1.

data.show(SomeNo); 

2.

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

Un modo sta usando count() funzione per ottenere il numero totale di record e utilizzare show(rdd.count()) .

Problemi correlati