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()
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'])]
vous pouvez aussi utiliser
example.groupByKey().mapValues(list)
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,))]
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é ...
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
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])))