2010-05-12 4 views

Répondre

7

Plan côté Rejoignez

Dans une carte côté (fragment-répliquées) joindre, vous détenez un ensemble de données en mémoire (en exemple une table de hachage) et rejoindre l'autre ensemble de données, enregistrement par cas record. Dans Pig, vous écririez

edges_from_list = JOIN a_follows_b BY user_a_id, some_list BY user_id using 'replicated'; 

en prenant soin que l'ensemble de données plus petit est sur le droit. Ceci est extrêmement efficace, car il n'y a pas de surcharge réseau et une demande CPU minimale.

Réduire Rejoignez

Dans une réduction côté rejoindre, vous regroupez sur la jointure tri fusion norme de clé à l'aide Hadoop.

<user_id {A, B, F, ..., Z}, { A, C, G, ..., Q} > 

et émettent un record pour chaque paire d'un élément du premier ensemble avec un élément de la deuxième série:

[A user_id A] 
[A user_id C] 
... 
[A user_id Q] 
... 
[Z user_id Q] 

Vous devez concevoir vos clés afin que l'ensemble de données avec le plus petit nombre d'enregistrements par la clé vient en premier - vous devez garder le premier groupe en mémoire et le second après. Dans Pig, pour une jointure standard, vous accomplissez ceci en mettant le dernier jeu de données le plus grand en dernier. (Par opposition à la jointure fragment-répliquée, où l'ensemble de données en mémoire est donné en dernier).

Notez que pour une jointure côté carte, le entier du jeu de données plus petit doit être en mémoire. Dans une jointure à réduction standard, seuls les groupes de chaque clé doivent être en mémoire (en fait le groupe de chaque clé excepté le dernier). Il est possible d'éviter même cette restriction, mais cela nécessite des soins; regardez par exemple au skewed join dans Pig.

Merge Join

Enfin, si les deux ensembles de données sont stockées dans l'ordre au total triés sur la clé de jointure, vous pouvez faire une jointure de fusion sur le côté de la carte. Identique à la jointure reduce-side, vous faites un tri de fusion vers cogroup sur la clé de jointure, puis projetez (aplatissez) sur les paires. Pour cette raison, lors de la génération d'un jeu de données fréquemment lu, il est souvent judicieux d'effectuer un tri total au dernier passage. Zebra et d'autres bases de données peuvent également vous donner une entrée totalement triée pour (presque) gratuitement.

0

Ces deux jointures de Hadoop sont des jointures de fusion qui nécessitent un tri (explicite) préalable. D'autre part, la jointure par hachage ne nécessite pas de tri, mais des données de partition par une fonction de hachage. La discussion détaillée peut être trouvée dans la section "Jointures relationnelles" dans Data-Intensive Text Processing with MapReduce par Jimmy Lin et Chris Dyer, un livre bien écrit qui est libre et open source.

Questions connexes