J'ai un RDD, où chaque enregistrement est un int :
[0,1,2,3,4,5,6,7,8]
Tout ce que je dois faire, c'est diviser ce RDD en lots. C'est-à-dire créer un autre RDD où chaque élément est une liste d'éléments de taille fixe :
[[0,1,2], [3,4,5], [6,7,8]]
Cela semble trivial, cependant, je suis perplexe depuis plusieurs jours et je ne trouve rien d'autre que la solution suivante :
-
Utilisez ZipWithIndex pour énumérer les enregistrements dans un RDD :
[0,1,2,3,4,5] -> [(0, 0),(1, 1),(2, 2),(3, 3),(4, 4),(5, 5)]
-
Itérer sur ce RDD en utilisant map() et calculer l'index comme suit
index = int(index / batchSize)
[1,2,3,4,5,6] -> [(0, 0),(0, 1),(0, 2),(1, 3),(1, 4),(1, 5)]
-
Regrouper ensuite par index généré.
[(0, [0,1,2]), (1, [3,4,5])]
Cela me permettra d'obtenir ce dont j'ai besoin, mais je ne veux pas utiliser le groupe par ici. C'est trivial lorsque vous utilisez Map Reduce ou une abstraction comme Apache Crunch. Mais existe-t-il un moyen de produire un résultat similaire dans Spark sans utiliser de groupe par ?