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()
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'])]
sie können auch verwenden
example.groupByKey().mapValues(list)
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,))]
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 ...
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
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])))