J'essaie d'imprimer le contenu d'une collection sur la console Spark.
J'ai un type:
linesWithSessionId: org.apache.spark.rdd.RDD[String] = FilteredRDD[3]
Et j'utilise la commande:
scala> linesWithSessionId.map(line => println(line))
Mais ceci est imprimé:
res1: org.apache.spark.rdd.RDD [Unit] = MappedRDD [4] sur la carte à: 19
Comment puis-je écrire le RDD sur la console ou l'enregistrer sur le disque afin de pouvoir afficher son contenu?
scala
apache-spark
ciel bleu
la source
la source
show
méthode.Réponses:
Si vous souhaitez afficher le contenu d'un RDD, une méthode consiste à utiliser
collect()
:Ce n'est pas une bonne idée, cependant, lorsque le RDD a des milliards de lignes. Utilisez
take()
pour n'en prendre que quelques-uns à imprimer:la source
saveAsTextFile
sur RDD est que j'ai besoin d'écrire le contenu RDD dans plus d'un fichier, c'est pourquoi j'utiliseforeach
La
map
fonction est une transformation , ce qui signifie que Spark n'évaluera pas réellement votre RDD jusqu'à ce que vous exécutiez une action dessus.Pour l'imprimer, vous pouvez utiliser
foreach
(qui est une action):Pour l'écrire sur le disque, vous pouvez utiliser l'une des
saveAs...
fonctions (actions fixes) de l' API RDDla source
collect
peut-être mentionner pour que le RDD puisse être imprimé dans la console.foreach
lui-même "matérialisera" d'abord le RDD puis s'exécuteraprintln
sur chaque élément, cecollect
n'est donc pas vraiment nécessaire ici (bien que vous puissiez l'utiliser, bien sûr) ...foreach
fonctionne bien. Si vous exécutez un travail sur un cluster et que vous souhaitez imprimer votre rdd, vous devezcollect
(comme indiqué par d'autres commentaires et réponses) afin qu'il soit envoyé au pilote avantprintln
son exécution. Et utilisertake
comme suggéré par Oussama pourrait être une bonne idée si votre RDD est trop gros.Si vous l'exécutez sur un cluster, il
println
ne sera pas imprimé dans votre contexte. Vous devez apporter lesRDD
données à votre session. Pour ce faire, vous pouvez le forcer sur la baie locale, puis l'imprimer:la source
Vous pouvez convertir votre
RDD
en unDataFrame
alorsshow()
il.Cela affichera les 20 premières lignes de vos données, donc la taille de vos données ne devrait pas être un problème.
la source
import spark.implicits._
toDF
nispark.implicits._
dans l'étincelle.Il existe probablement de nombreuses différences architecturales entre
myRDD.foreach(println)
etmyRDD.collect().foreach(println)
(non seulement «collecter», mais aussi d'autres actions). L'une des différences que j'ai constatées est que lors de l'exécutionmyRDD.foreach(println)
, la sortie sera dans un ordre aléatoire. Par exemple: si mon rdd provient d'un fichier texte où chaque ligne a un numéro, la sortie aura un ordre différent. Mais quand je l'ai faitmyRDD.collect().foreach(println)
, l'ordre reste exactement comme le fichier texte.la source
En python
Cela imprimera tout le contenu du RDD
la source
et la version plus récente de Spark affichera bien la table.
la source
Au lieu de taper à chaque fois, vous pouvez;
[1] Créez une méthode d'impression générique dans Spark Shell.
[2] Ou mieux encore, en utilisant des implicits, vous pouvez ajouter la fonction à la classe RDD pour imprimer son contenu.
Exemple d'utilisation:
Production:
Important
Cela n'a de sens que si vous travaillez en mode local et avec une petite quantité de données. Sinon, vous ne pourrez pas voir les résultats sur le client ou vous manquerez de mémoire en raison du résultat du grand ensemble de données.
la source
Vous pouvez également enregistrer sous forme de fichier:
rdd.saveAsTextFile("alicia.txt")
la source
Dans la syntaxe java:
la source