Trouver le moyen de nombres à l'aide de MapReduce
J'ai essayé d'écrire un peu de code pour trouver la moyenne de nombres à l'aide de MapReduce.
Je suis en train d'utiliser des compteurs globaux à atteindre mon but, mais je ne suis pas en mesure de définir la valeur du compteur dans le map
méthode de mon Mappeur et je suis également pas en mesure de retrive la valeur du compteur dans le reduce
méthode de mon Réducteur.
Dois-je utiliser un compteur global dans map
de toute façon (par exemple en utilisant incrCounter(key, amount)
de la condition Reporter
)? Ou voulez-vous suggérer une logique différente pour obtenir la moyenne de certains numéros?
Merci de poster le code que vous avez jusqu'à présent.
Pas de.ce n'est pas de devoirs...c'est le projet que je suis..
Hey,je n'ai pas le code ryt maintenant..je peux le poster sur le lundi.. mais si u ont travaillé u peut aider plz??
Nous pas vous aider sans code. Ce n'est pas la façon dont StackOverflow œuvres.
Une autre suggestion que vous pourriez vouloir regarder dans est à l'aide de Porc, ce qui les résumés de vous éloigner de la Carte de Réduire les détails et dans un langage de plus haut niveau. Ils ont un exemple sur la page de présentation qui peut être similaire à ce que vous êtes en train de faire - wiki.apache.org/pig/PigOverview
Pas de.ce n'est pas de devoirs...c'est le projet que je suis..
Hey,je n'ai pas le code ryt maintenant..je peux le poster sur le lundi.. mais si u ont travaillé u peut aider plz??
Nous pas vous aider sans code. Ce n'est pas la façon dont StackOverflow œuvres.
Une autre suggestion que vous pourriez vouloir regarder dans est à l'aide de Porc, ce qui les résumés de vous éloigner de la Carte de Réduire les détails et dans un langage de plus haut niveau. Ils ont un exemple sur la page de présentation qui peut être similaire à ce que vous êtes en train de faire - wiki.apache.org/pig/PigOverview
OriginalL'auteur Amnesiac | 2012-05-19
Vous devez vous connecter pour publier un commentaire.
La logique est assez simple:
Si tous les nombres ont la même clé, puis le mappeur a envoyé à toutes les valeurs que vous voulez trouver le moyen de le faire avec la même clé. De ce fait, dans le réducteur, vous pouvez additionner les valeurs de l'itérateur. Vous pouvez ensuite faire un contre sur le nombre de temps de l'itérateur œuvres, ce qui résout le problème de la façon dont de nombreux éléments sont le calcul de la moyenne. Enfin, après l'itérateur, vous pouvez trouver la moyenne en divisant la somme par le nombre d'éléments.
Être prudent, cette logique ne fonctionnera pas si le viseur de la classe est définie comme la même classe que réducteur...
Je pense que cette approche rend inutile la notion de MapReduce, parce que, depuis, les chiffres ont la même clé, alors il n'y aura qu'un seul réducteur .. Une meilleure approche pourrait être de diviser l'entrée dans des seaux (affectation de touches), et le nombre de seaux doivent être sqrt(n), où n est le nombre de nombres.
OriginalL'auteur Sibimon Sasidharan
Utiliser tous les 3 Mapper/Combiner/Réducteur pour résoudre le problème.
Consultez ci-dessous le lien pour remplir le code & explication
http://alchemistviews.blogspot.com/2013/08/calculate-average-in-map-reduce-using.html
OriginalL'auteur Pankaj Khattar
Moyenne est la somme /taille. Si la somme est quelque chose comme somme = k1 + k2 + k3 + ... , vous pouvez diviser par la taille après ou durant la synthèse. Si la moyenne est également k1 /taille + k2 /taille + k3 /taille + ...
La Java 8 code est simple:
Donc de la première carte de chaque valeur de vos éléments dans la liste en double puis en additionnant via la fonction de réduction.
OriginalL'auteur mkaul
La moyenne arithmétique est une fonction d'agrégation qui n'est pas distributive mais algébrique. Selon Han et coll. une fonction d'agrégation est distributive si:
Ou, en d'autres termes, il doit être associative et commutative. Une fonction d'agrégation est cependant algébrique selon Han et coll. si:
Pour la moyenne arithmétique, c'est juste moyenne = somme/comte. Évidemment, vous devez effectuer un nombre de plus. Mais à l'aide d'un compteur global à cet effet semble être un abus. Le API décrit
org.apache.hadoop.mapreduce.Counter
comme suit:Compteurs devraient être généralement utilisés pour les statistiques sur les emplois de toute façon, mais pas dans les calculs lors du traitement des données lui-même.
Donc tout ce que vous avez à faire à l'intérieur d'une partition est à ajouter vos numéros en place et le suivi de leur nombre et la somme (sum, count); une approche simple peut être une chaîne de caractères comme
<sum><separator><count>
.Dans le mapper le comte sera toujours 1 et la somme est la valeur brute elle-même. Afin de réduire les fichiers de carte déjà vous pouvez utiliser le viseur et traiter les agrégats comme (sum_1 + ... + sum_n, count_1 + ... + count_n). Ceci doit être répété dans le réducteur et fini par le calcul final somme/comte. Gardez à l'esprit que cette approche est indépendante de la clé utilisée!
Enfin, voici un exemple simple à l'aide de la crue statistiques de la criminalité de la LAPD qui devrait calcule la "moyenne du temps de la criminalité" à Los Angeles:
OriginalL'auteur witrin