Lancer une application simple dans pyspark.
f = sc.textFile("README.md")
wc = f.flatMap(lambda x: x.split(' ')).map(lambda x: (x, 1)).reduceByKey(add)
Je souhaite afficher le contenu d'un RDD en utilisant l'action foreach:
wc.foreach(print)
Cela génère une erreur de syntaxe:
SyntaxError: invalid syntax
Qu'est-ce que je rate?
Cette erreur est due au fait que print
n'est pas une fonction de Python 2.6.
Vous pouvez soit définir un fichier UDF d'assistance effectuant l'impression, soit utiliser la bibliothèque _FUTURE_ pour traiter print
comme une fonction:
>>> from operator import add
>>> f = sc.textFile("README.md")
>>> def g(x):
... print x
...
>>> wc.foreach(g)
ou
>>> from __future__ import print_function
>>> wc.foreach(print)
Cependant, je pense qu'il serait préférable d'utiliser collect()
pour ramener le contenu du RDD au pilote, car foreach
s'exécute sur les nœuds de travail et les sorties risquent de ne pas apparaître dans votre pilote/Shell (cela sera probablement en mode local
, mais pas lors de l'exécution sur un cluster).
>>> for x in wc.collect():
... print x
Dans Spark 2.0 (je n'ai pas testé avec les versions précédentes). Simplement:
print myRDD.take(n)
Où n est le nombre de lignes et myRDD est wc dans votre cas.
Si vous voulez voir le contenu de RDD, alors collecter oui est une option, mais il récupère toutes les données dans le pilote, ce qui peut poser problème.
<rdd.name>.take(<num of elements you want to fetch>)
Mieux si vous voulez voir juste un échantillon
Exécuter foreach et essayer d’imprimer, je ne le recommande pas, car si vous exécutez ceci sur un cluster, les journaux d’impression seraient alors locaux pour l’exécuteur et imprimeraient les données accessibles à cet exécuteur. L'instruction print ne modifie pas l'état et n'est donc pas logiquement erronée. Pour obtenir tous les journaux, vous devrez faire quelque chose comme
**Pseudocode**
collect
foreach print
Toutefois, cela peut entraîner une défaillance du travail, car la collecte de toutes les données sur le pilote risque de le bloquer. Je suggérerais d’utiliser la commande take ou si vous voulez l’analyser, utilisez sample collect sur le pilote ou écrivez dans un fichier puis analysez-le.
Essaye ça:
data = f.flatMap(lambda x: x.split(' '))
map = data.map(lambda x: (x, 1))
mapreduce = map.reduceByKey(lambda x,y: x+y)
result = mapreduce.collect()
Veuillez noter que lorsque vous exécutez collect (), le RDD, qui est un ensemble de données distribuées, est agrégé sur le nœud du pilote et est essentiellement converti en liste. Alors évidemment, ce ne sera pas une bonne idée de collecter () un ensemble de données 2T. Si vous n'avez besoin que de quelques échantillons de votre RDD, utilisez take (10).
Par le dernier document, vous pouvez utiliser rdd.collect (). Foreach (println) sur le pilote pour tout afficher, mais cela peut entraîner des problèmes de mémoire sur le pilote, le mieux est d’utiliser rdd.take (nombre_supplé
https://spark.Apache.org/docs/2.2.0/rdd-programming-guide.html
Pour imprimer tous les éléments du pilote, vous pouvez utiliser la méthode collect () pour amener d’abord le RDD au nœud du pilote, ainsi: rdd.collect (). Foreach (println). Cependant, cela peut entraîner une insuffisance de mémoire du pilote, car collect () récupère l'intégralité du RDD sur une seule machine. si vous n'avez besoin que d'imprimer quelques éléments du RDD, une approche plus sûre consiste à utiliser le paramètre take (): rdd.take (100) .foreach (println).
Vous pouvez simplement collecter le RDD complet (qui retournera une liste) et imprimer cette liste
print(wc.collect)