PySpark groupByKey renvoyant pyspark.resultiterable.ResultIterable

J’essaie de comprendre pourquoi mon groupByKey renvoie les éléments suivants:

[(0, ), (1, ), (2, ), (3, ), (4, ), (5, ), (6, ), (7, ), (8, ), (9, )] 

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 object qui vous permet de parcourir les résultats. Vous pouvez transformer les résultats de groupByKey en une 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,  

vous pouvez aussi utiliser

 example.groupByKey().mapValues(list) 

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 la sortie souhaitée …

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