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
?
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.
Une méthode consiste à utiliser la fonction count()
pour obtenir le nombre total d'enregistrements et à utiliser show(rdd.count())
.
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).
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.
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);
}
});