J'ai lu des livres liés à Hadoop ces derniers jours. Je me sens un peu comme ça, donc j'ai écrit un produit statistiquement lié en imitant le programme WordCount.
Description des exigences:
Selon la liste des ventes du supermarché, calculez le degré de corrélation entre les marchandises (c'est-à-dire compter le nombre de fois que vous achetez des marchandises A et les marchandises B en même temps).
Format de données:
La liste des ventes de supermarchés est simplifiée au format suivant: une ligne représente une liste, et chaque produit est divisé en "," comme indiqué sur la figure ci-dessous:
Analyse des exigences:
Utilisez MapReduce dans Hadoop pour calculer cette exigence.
La fonction de carte divise principalement les produits associés, le résultat de sortie est que la clé est le produit A et la valeur est le produit B. Le résultat divisé pour les premiers et trois résultats est illustré dans la figure ci-dessous:
Afin de compter les produits qui souhaitent être associés aux deux produits A et B, la relation entre les produits A et B produit deux résultats, à savoir AB et BA.
La fonction réduit regroupée et compté les produits liés au produit A, c'est-à-dire calculer le nombre de fois que chaque produit apparaît dans la valeur, et le résultat de sortie est que la clé est le produit A | produit B, et la valeur est le nombre de fois que cette combinaison se produit. Pour les 5 enregistrements mentionnés ci-dessus, analysez la valeur clé de R dans la sortie de la carte:
Grâce au traitement de la fonction MAP, l'enregistrement indiqué dans la figure ci-dessous est obtenu:
La valeur de valeur de valeur en réduction est groupé et comptée, et le résultat est illustré dans la figure ci-dessous.
Utilisez le produit AB comme clé, combinez le nombre de produits comme valeur à la sortie, et le résultat de sortie est illustré dans la figure ci-dessous:
Jusqu'à présent, l'analyse du processus de mise en œuvre des exigences est terminée. Jetons un coup d'œil à l'implémentation de code spécifique ci-dessous.
Implémentation du code:
Je ne donnerai pas une introduction détaillée au code, veuillez vous référer aux commentaires du code pour plus de détails.
package com; Importer java.io.ioException; import java.util.hashmap; import java.util.map.entry; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.conf.configured; import org.apache.hadoop.fs.path; import org.apache.hadoop.io.intwitable; import org.apache.hadoop.io.longwitable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; import org.apache.hadoop.util.tool; import org.apache.hadoop.util.toolrunner; Le test de classe publique étend l'outil d'implémentés configurés {/ ** * classe MAP, implémentation de prétraitement des données * La clé de résultat de sortie est le produit une valeur et le produit associé b * @author Lulei * / public static class MAPT étend le mappeur <longwritable, le texte, le texte> {public Void Map (Longwitable Key, STRING VALUE, contexte de contexte); if (! (line == null || "" .equals (line)) {// diviser la chaîne de produit [] vs = line.split (","); // combinant les deux pour former un enregistrement pour (int i = 0; i <(vs.Length - 1); i ++) {if ("" .equal vs.Length; j ++) {if (".equals (vs [j])) {continue;} // La clé de résultat est le produit A | B, qui est le nombre d'associations * @Author Lulei * / public static Reducet étend le réducteur <Texte, Texte, Texte, Context Context) {// Obtenez le nombre minimum de RETROYAGE. Integer.ParseInt (COMPTST);} Catch (Exception E) {this.Count = 0;}} public void réduction (Text Key, Itable Hashmap <String, Integer> Hashmap = new HashMap <String, Integer> (); // Utilisez le hachage pour compter le nombre de produits B pour (valeur texte: valeurs) {String Valuestr = value.toString (); if (hashmap.containsKey (valluest)) {hashmap.put (valluest, hashmap.get (valluest) + 1); } else {hashmap.put (Valuestr, 1); }} // Sortie du résultat pour (entrée <string, entier> entrée: hashmap.entrySet ()) {if (entry.getValue ()> = this.Count) {// seulement output context.write (new Text (keyStr + "|" + entry.getKey ()), new IntWitable (entry.getValue ())); }}}} @Override public int run (String [] arg0) lève l'exception {// TODO Méthode générée automatiquement Configuration du stub conf = getConf (); conf.set ("count", arg0 [2]); Job travail = nouveau travail (conf); job.setJobName ("JobTest"); job.setOutputFormatClass (textoutputFormat.class); job.setOutputKeyClass (text.class); job.setOutputValuClass (text.class); job.setMapperClass (Mapt.class); job.setReducerclass (reducet.class); FileInputFormat.AddinputPath (Job, New Path (Arg0 [0])); FileOutputFormat.SetOutputPath (Job, New Path (Arg0 [1])); job.AiTForCompletion (true); RETOUR JOB.SUCCESSFUL ()? 0: 1; } / ** * @param args * / public static void main (String [] args) {// TODO Méthode générée automatiquement } try {int res = toolrunner.run (new configuration (), new test (), args); System.Exit (RES); } catch (exception e) {// TODO Bloc de capture généré automatiquement e.printStackTrace (); }}} Télécharger et exécuter:
Emballez le programme dans un fichier JAR et téléchargez-le dans le groupe de machines. Téléchargez également les données de test sur le système de fichiers distribué HDFS.
La capture d'écran de la commande en cours d'exécution est indiquée dans la figure suivante:
Une fois l'exécution terminée, vérifiez le système de fichiers HDFS correspondant, comme indiqué dans la figure ci-dessous:
Voici un programme MapReduce complet. Je continuerai à en savoir plus sur Hadoop ~ Merci d'avoir lu, j'espère que cela pourra vous aider. Merci pour votre soutien à ce site!