Comment transposer un RDD dans Spark
J'ai un RDD comme ceci:
1 2 3
4 5 6
7 8 9
C'est une matrice. Maintenant, je veux transposer la RDD comme ceci:
1 4 7
2 5 8
3 6 9
Comment puis-je faire cela?
source d'informationauteur | 2015-04-01
Vous devez vous connecter pour publier un commentaire.
Disons que vous avez un N×M la matrice.
Si N et M sont si petits que vous pouvez tenir de N×M éléments dans la mémoire, il n'a pas beaucoup de sens d'utiliser un RDD. Mais la transposition, c'est facile:
Si N ou M est si grande que vous ne pouvez pas mettre N ou M entrées dans la mémoire, alors vous ne pouvez pas avoir un EDR ligne de cette taille. Soit l'original ou de la matrice transposée est impossible de représenter dans cette affaire.
N et M peuvent être de taille moyenne: vous pouvez maintenir la N ou M entrées dans la mémoire, mais vous ne pouvez pas tenir de N×M entrées. Dans ce cas, vous devez faire exploser la matrice et le mettre de nouveau ensemble:
Un premier projet sans l'aide de collect(), donc tout se passe côté des travailleurs et rien n'est fait sur le conducteur:
Le problème avec cette solution est que les colonnes de la matrice transposée sera à la fin battues si l'opération est effectuée dans un système distribué. Pense à une version améliorée
Mon idée est que, en plus de fixer la colonne "numéro" à chaque élément de la matrice, nous accordons également le "numéro de ligne'. Nous avons donc pu clé en position de la colonne et de se regrouper par clé comme dans l'exemple, mais on pourrait réorganiser chaque ligne sur le numéro de ligne et alors bande de ligne/colonne des nombres de la suite.
Je n'ai pas un moyen de savoir le nombre de ligne lors de l'importation d'un fichier dans un RDD.
Vous pourriez penser que c'est du lourd pour joindre une colonne et un numéro de ligne pour chaque élément de la matrice, mais je suppose que c'est le prix à payer pour avoir la possibilité de pouvoir traiter votre entrée comme les morceaux dans un mode de distribution et ainsi traiter d'énormes matrices.
Sera mise à jour de la réponse quand j'ai trouver une solution au problème de la commande.
Comme des Étincelles de 1,6 vous pouvez utiliser le pivot de l'opération sur DataFrames, en fonction de la forme réelle de vos données, si vous la mettez dans un DF vous pourriez pivot colonnes de lignes, suivantes databricks blog est très utile car il décrit en détail un certain nombre de pivotement cas d'utilisation avec des exemples de code