web-dev-qa-db-de.com

RDD-Inhalte in Python Spark anzeigen?

Ausführen einer einfachen App in Pyspark.

f = sc.textFile("README.md")
wc = f.flatMap(lambda x: x.split(' ')).map(lambda x: (x, 1)).reduceByKey(add)

Ich möchte RDD-Inhalte mit foreach-Aktion anzeigen:

wc.foreach(print)

Dies löst einen Syntaxfehler aus: 

SyntaxError: invalid syntax

Was vermisse ich?

35
lmart999

Dieser Fehler ist darauf zurückzuführen, dass print in Python 2.6 keine Funktion ist.

Sie können entweder eine Helfer-UDF definieren, die den Druck durchführt, oder die Bibliothek _FUTURE_ verwenden, um print als Funktion zu behandeln:

>>> from operator import add
>>> f = sc.textFile("README.md")
>>> def g(x):
...     print x
...
>>> wc.foreach(g)

oder

>>> from __future__ import print_function
>>> wc.foreach(print)

Ich denke jedoch, es wäre besser, collect() zu verwenden, um den RDD-Inhalt wieder zum Treiber zu bringen, da foreach auf den Worker-Knoten ausgeführt wird und die Ausgaben möglicherweise nicht unbedingt in Ihrem Treiber/in der Shell erscheinen (dies wird wahrscheinlich im local-Modus erfolgen, aber nicht wenn Sie in einem Cluster laufen).

>>> for x in wc.collect():
...     print x
38
Josh Rosen

In Spark 2.0 (habe ich nicht mit früheren Versionen getestet). Einfach:

print myRDD.take(n)

Wo n ist die Anzahl der Zeilen und myRDD ist wc in Ihrem Fall.

21

Wenn Sie den Inhalt von RDD anzeigen möchten, ist ja collect (Sammeln) eine Option, es werden jedoch alle Daten vom Treiber abgerufen, sodass ein Problem auftreten kann 

<rdd.name>.take(<num of elements you want to fetch>)

Besser, wenn Sie nur eine Probe sehen möchten

Wenn Sie foreach ausführen und versuchen zu drucken, empfehle ich dies nicht, da die Druckprotokolle für den Executor lokal gespeichert werden und die für diesen Executor zugänglichen Daten gedruckt werden. Die Anweisung print ändert den Status nicht und ist daher logisch nicht falsch. Um alle Protokolle zu erhalten, müssen Sie etwas tun

**Pseudocode**
collect
foreach print

Dies kann jedoch dazu führen, dass der Job fehlschlägt, da das Sammeln aller Daten des Treibers zum Absturz führen kann. Ich würde vorschlagen, take command zu verwenden, oder wenn Sie es analysieren wollen, verwenden Sie sample collect auf dem Treiber oder schreiben Sie in die Datei und analysieren Sie es.

6
iec2011007

Versuche dies:

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

Bitte beachten Sie, dass beim Ausführen von collect () die RDD, bei der es sich um eine verteilte Datei handelt, am Treiberknoten zusammengefasst und im Wesentlichen in eine Liste umgewandelt wird. Es ist daher offensichtlich keine gute Idee, einen 2T-Datensatz zu sammeln (). Wenn Sie nur ein paar Beispiele von Ihrem RDD benötigen, verwenden Sie take (10).

5
Jeevs

Mit dem neuesten Dokument können Sie rdd.collect (). Foreach (println) im Treiber verwenden, um alle anzuzeigen. Dies kann jedoch Speicherprobleme im Treiber verursachen.

https://spark.Apache.org/docs/2.2.0/rdd-programming-guide.html

Um alle Elemente auf dem Treiber zu drucken, können Sie die collect () -Methode verwenden, um zuerst die RDD auf den Treiberknoten zu bringen: rdd.collect (). Foreach (println). Dies kann jedoch dazu führen, dass der Treiber nicht mehr über genügend Arbeitsspeicher verfügt, da collect () die gesamte RDD auf eine einzige Maschine abruft. Wenn Sie nur wenige Elemente der RDD drucken müssen, verwenden Sie die Methode take (): rdd.take (100) .foreach (println).

1
YDD9

Sie können einfach die gesamte RDD (die eine Liste zurückgibt) sammeln und diese Liste ausdrucken:

print(wc.collect)
0
alehresmann