web-dev-qa-db-fra.com

Afficher le contenu de RDD dans Python Spark?

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?

35
lmart999

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
38
Josh Rosen

Dans Spark 2.0 (je n'ai pas testé avec les versions précédentes). Simplement:

print myRDD.take(n)

n est le nombre de lignes et myRDD est wc dans votre cas.

21
Frederico Oliveira

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.

6
iec2011007

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).

5
Jeevs

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).

1
YDD9

Vous pouvez simplement collecter le RDD complet (qui retournera une liste) et imprimer cette liste

print(wc.collect)
0
alehresmann