web-dev-qa-db-fra.com

PySpark groupByKey retournant pyspark.resultiterable.ResultIterable

J'essaie de comprendre pourquoi mon groupByKey renvoie ce qui suit:

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

J'ai des valeurs flatMapped qui ressemblent à ceci: 

[(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')]

Je fais juste un simple: 

groupRDD = columnRDD.groupByKey()
40
theMadKing

Ce que vous récupérez est un objet qui vous permet de parcourir les résultats. Vous pouvez transformer les résultats de groupByKey en liste en appelant list () sur les valeurs, par exemple.

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

vous pouvez aussi utiliser

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

Exemple:

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

Résultat:

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

Au lieu d'utiliser groupByKey (), je vous suggère d'utiliser cogroup (). Vous pouvez vous référer à l'exemple ci-dessous.

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

Exemple:

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

Vous devriez obtenir le résultat souhaité ...

1
Harsha

Dites que votre code est ..

ex2 = ex1.groupByKey()

Et puis tu cours ..

ex2.take(5)

Vous allez voir un itérable. Si vous faites quelque chose avec ces données, vous pouvez continuer. Mais si tout ce que vous voulez, c’est d’imprimer/de voir les valeurs avant de passer à autre chose, c’est un peu un hack.

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

ou juste

ex2.toDF().show()

Cela montrera les valeurs des données. Vous ne devriez pas utiliser collect() car cela renverrait des données au pilote, et si vous travaillez sur beaucoup de données, cela va exploser. Maintenant, si ex2 = ex1.groupByKey() était votre dernière étape et que vous voulez que ces résultats soient renvoyés, alors oui, utilisez collect() mais assurez-vous de savoir que vos données renvoyées ont un volume faible.

print(ex2.collect())

Voici un autre article de Nice sur l’utilisation de collect () sur RDD

Voir le contenu RDD dans Python Spark?

0
yeamusic21

En plus des réponses ci-dessus, si vous voulez la liste triée d’articles uniques, utilisez ce qui suit:

Liste des valeurs distinctes et triées

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

Juste liste des valeurs triées

example.groupByKey().mapValues(sorted)

Alternative à ci-dessus

# 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
Aniruddha Kalburgi