web-dev-qa-db-fra.com

Existe-t-il un meilleur moyen d’afficher l’ensemble de Spark SQL DataFrame?

Je souhaite afficher l'intégralité du DataFrame Apache Spark SQL avec l'API Scala. Je peux utiliser la méthode show():

myDataFrame.show(Int.MaxValue)

Existe-t-il un meilleur moyen d'afficher un DataFrame complet que d'utiliser Int.MaxValue?

29
Yuri Brovman

Il est généralement déconseillé d'afficher un DataFrame complet sur stdout, car cela signifie que vous devez extraire le DataFrame complet (toutes ses valeurs) vers le pilote (sauf si DataFrame est déjà local, vous pouvez vérifier avec df.isLocal).

Si vous ne savez pas à l'avance que la taille de votre jeu de données est suffisamment petite pour que le processus JVM du pilote dispose de suffisamment de mémoire pour accueillir toutes les valeurs, cela n'est pas sûr. C'est pourquoi la fonction show() de l'API DataFrame par défaut ne vous montre que les 20 premières lignes.

Vous pouvez utiliser le df.collect qui retourne Array[T], puis parcourez chaque ligne et imprimez-la:

df.collect.foreach(println)

mais vous perdez tout le formatage implémenté dans df.showString(numRows: Int) (que show() utilise en interne).

Donc non, je suppose qu'il n'y a pas de meilleur moyen.

51
Grega Kešpret

Une méthode consiste à utiliser la fonction count() pour obtenir le nombre total d'enregistrements et à utiliser show(rdd.count()).

3
AkshayK

Comme d'autres l'ont suggéré, imprimer l'intégralité de DF est une mauvaise idée. Cependant, vous pouvez utiliser df.rdd.foreachPartition(f) pour imprimer partition par partition sans submerger la JVM du pilote (y en utilisant collect).

2
ayan guha

Rien de plus succinct que cela, mais si vous voulez éviter le Int.MaxValue, vous pouvez utiliser un collect et le traiter ou foreach. Mais pour un format tabulaire sans beaucoup de code manuel, show est ce que vous pouvez faire de mieux.

1
Justin Pihony

Dans Java je l'ai essayé de deux manières . Cela fonctionne parfaitement pour moi: 

1.  

data.show(SomeNo);

2.  

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