web-dev-qa-db-de.com

PySpark groupByKey gibt pyspark.resultiterable.ResultIterable zurück

Ich versuche herauszufinden, warum mein groupByKey Folgendes zurückgibt:

[(0, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a210>), (1, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a4d0>), (2, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a390>), (3, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a290>), (4, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a450>), (5, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a350>), (6, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a1d0>), (7, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a490>), (8, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a050>), (9, <pyspark.resultiterable.ResultIterable object at 0x7fc659e0a650>)]

Ich habe flatMapped-Werte, die folgendermaßen aussehen: 

[(0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D'), (0, u'D')]

Ich mache nur eine einfache: 

groupRDD = columnRDD.groupByKey()
40
theMadKing

Sie erhalten ein Objekt, mit dem Sie die Ergebnisse durchlaufen können. Sie können die Ergebnisse von groupByKey in eine Liste umwandeln, indem Sie list () für die Werte aufrufen, z.

example = sc.parallelize([(0, u'D'), (0, u'D'), (1, u'E'), (2, u'F')])

example.groupByKey().collect()
# Gives [(0, <pyspark.resultiterable.ResultIterable object ......]

example.groupByKey().map(lambda x : (x[0], list(x[1]))).collect()
# Gives [(0, [u'D', u'D']), (1, [u'E']), (2, [u'F'])]
59
dpeacock

sie können auch verwenden

example.groupByKey().mapValues(list)
19
Jayaram

Beispiel:

r1 = sc.parallelize([('a',1),('b',2)])
r2 = sc.parallelize([('b',1),('d',2)])
r1.cogroup(r2).mapValues(lambdax:Tuple(reduce(add,__builtin__.map(list,x))))

Ergebnis:

[('d', (2,)), ('b', (2, 1)), ('a', (1,))]
1
bin yan

Anstelle von groupByKey () würde ich vorschlagen, dass Sie cogroup () verwenden. Sie können auf das unten stehende Beispiel verweisen.

[(x, Tuple(map(list, y))) for x, y in sorted(list(x.cogroup(y).collect()))]

Beispiel:

>>> x = sc.parallelize([("foo", 1), ("bar", 4)])
>>> y = sc.parallelize([("foo", -1)])
>>> z = [(x, Tuple(map(list, y))) for x, y in sorted(list(x.cogroup(y).collect()))]
>>> print(z)

Sie sollten die gewünschte Ausgabe erhalten ...

1
Harsha

Sagen Sie, Ihr Code lautet ..

ex2 = ex1.groupByKey()

Und dann rennst du ..

ex2.take(5)

Du wirst eine Iterable sehen. Das ist in Ordnung, wenn Sie mit diesen Daten etwas anfangen wollen, können Sie einfach weitermachen. Aber wenn Sie nur die Werte zuerst drucken/sehen möchten, bevor Sie fortfahren, ist hier ein kleiner Hacker.

ex2.toDF().show(20, False)

oder nur

ex2.toDF().show()

Dies zeigt die Werte der Daten. Sie sollten collect() nicht verwenden, da dies dem Fahrer Daten zurückgibt, und wenn Sie viele Daten abarbeiten, wird dies Sie in die Luft jagen. Wenn nun ex2 = ex1.groupByKey() Ihr letzter Schritt war und Sie möchten, dass diese Ergebnisse zurückgegeben werden, verwenden Sie collect(), aber stellen Sie sicher, dass Sie wissen, dass Ihre zurückgegebenen Daten ein geringes Volumen haben.

print(ex2.collect())

Hier ist ein weiterer netter Beitrag zur Verwendung von collect () auf RDD

RDD-Inhalte in Python Spark anzeigen?

0
yeamusic21

Wenn Sie zusätzlich zu den obigen Antworten eine sortierte Liste mit eindeutigen Elementen erstellen möchten, verwenden Sie Folgendes:

Liste der unterschiedlichen und sortierten Werte

example.groupByKey().mapValues(set).mapValues(sorted)

Nur Liste der sortierten Werte

example.groupByKey().mapValues(sorted)

Alternative zu oben

# List of distinct sorted items
example.groupByKey().map(lambda x: (x[0], sorted(set(x[1]))))

# just sorted list of items
example.groupByKey().map(lambda x: (x[0], sorted(x[1])))
0