Jointure de deux ensembles de données dans Mapreduce/Hadoop
Personne ne sait comment les mettre en œuvre au Naturel-opération de Jointure entre les deux ensembles de données dans Hadoop?
Plus précisément, voici ce que j'ai exactement besoin de le faire:
Je vais avoir deux ensembles de données:
-
point information qui est stockée en tant que (tile_number, point_id:point_info) , c'est un 1:n paires clé-valeur. Cela signifie que pour chaque tile_number, il peut y avoir plusieurs point_id:point_info
-
Ligne de l'information qui est stockée en tant que (tile_number, line_id:line_info) , c'est à nouveau un 1:m paires clé-valeur et pour chaque tile_number, il pourrait y avoir plus d'un line_id:line_info
Comme vous pouvez le voir le tile_numbers sont les mêmes entre les deux ensembles de données. maintenant ce que j'ai vraiment besoin de faire est de rejoindre ces deux ensembles de données en fonction de chaque tile_number. En d'autres termes, pour chaque tile_number, nous avons n point_id:point_info et m line_id:line_info. Ce que je veux faire est d'adhérer à toutes les paires de point_id:point_info avec toutes les paires de line_id:line_info pour chaque tile_number
Afin de clarifier, voici un exemple:
Pour point de paires:
(tile0, point0)
(tile0, point1)
(tile1, point1)
(tile1, point2)
pour les paires de lignes:
(tile0, line0)
(tile0, line1)
(tile1, line2)
(tile1, line3)
ce que je veux, c'est comme suivant:
pour la case 0:
(tile0, point0:line0)
(tile0, point0:line1)
(tile0, point1:line0)
(tile0, point1:line1)
pour la tuile 1:
(tile1, point1:line2)
(tile1, point1:line3)
(tile1, point2:line2)
(tile1, point2:line3)
OriginalL'auteur reza | 2012-08-03
Vous devez vous connecter pour publier un commentaire.
Utiliser un mappeur que les sorties de titres que les clés et les points/lignes de valeurs. Tu dois faire la différence entre le point de sortie des valeurs et de la ligne des valeurs de sortie. Par exemple, vous pouvez utiliser un caractère spécial (même si une approche binaire serait beaucoup mieux).
La carte de sortie sera quelque chose comme:
Puis, au réducteur, votre apport aura cette structure:
et vous devrez prendre les valeurs de séparer les points et les lignes, de faire une croix de produits et de sortie de chaque paire de la croix-produit , comme ceci:
Si vous pouvez déjà facilement différencier les valeurs de point et la ligne de valeurs (en fonction de vos spécifications de l'application), vous n'avez pas besoin de caractères spéciaux (*,_)
Concernant la croix-produit qui vous avez à faire dans le réducteur:
De la première itération sur l'ensemble de la Liste de valeurs, de les séparer en 2 liste:
Puis faire le produit vectoriel à l'aide de 2 boucles for imbriquées.
Puis itérer sur la liste et pour chaque élément de sortie:
J'ai édité ma réponse !
très grand, mais il ne fonctionne que si vous pouvez ajuster l'ensemble de points ou de lignes dans la mémoire pour les stocker dans les deux mentionnés Liste. Je crains que ce n'est pas le cas dans ma grands ensembles de données:(
Ce post est très vieux, mais depuis que j'ai un problème très similaire à cela afin de poster ici. Quelqu'un peut-il donner un exemple de code ici comme façon de faire dans la map/reduce format. Je suis en train d'essayer de comprendre et d'apprendre. Merci d'avance
avez-vous trouvé la solution ci-dessus pour les grands ensembles de données ??
OriginalL'auteur Razvan
Donc, fondamentalement, vous avez deux options ici.Réduire côté de jointure ou de la Carte de Jointure Côté .
Ici votre clé de groupe est "tuile". En un seul réducteur que vous allez obtenir toutes les données de sortie à partir d'un point en paire et en ligne paire. Mais vous, vous n'aurez qu'à cache point la paire ou des paires de lignes dans le tableau. Si l'une des paires(point ou d'une ligne) sont de très grande taille qui ne peut tenir dans votre tableau temporaire de la mémoire pour une seule clé de groupe(chaque tuile), alors cette méthode ne fonctionnera pas pour vous. Rappelez-vous vous n'avez pas à tenir à la fois de paires de clés pour unique clé de groupe("tuile") dans la mémoire, il sera suffisant.
Si les deux paires de clés pour unique clé de groupe sont grand , alors vous devez essayer de la carte du côté de la rejoindre.Mais il y a des conditions particulières. Cependant, vous pouvez répondre à ces exigence en faisant un peu de pré-traitement de vos données par le biais de certaines map/reduce travaux en cours d'exécution en nombre égal, de réducteurs pour les données.
OriginalL'auteur Animesh Raj Jha
J'ai trouvé celui-ci comme utile
Rejoint avec plaine de la Carte de Réduire ou d'MultipleInputs
http://kickstarthadoop.blogspot.in/2011/09/joins-with-plain-map-reduce.html
OriginalL'auteur Nishant Kumar