Ich habe in den letzten Tagen Hadoop-bezogene Bücher gelesen. Ich fühle mich ein bisschen so, also habe ich ein statistisch verwandtes Produkt geschrieben, indem ich das Wortcount -Programm nachahmte.
Anforderung Beschreibung:
Berechnen Sie gemäß der Verkaufsliste des Supermarkts den Korrelationsgrad zwischen Waren (dh die Anzahl der Kauf von Waren A und Waren B gleichzeitig).
Datenformat:
Die Supermarktverkaufsliste ist im folgenden Format vereinfacht: Eine Zeile repräsentiert eine Liste, und jedes Produkt ist in "" ", wie in der folgenden Abbildung gezeigt:
Anforderungsanalyse:
Verwenden Sie MapReduce in Hadoop, um diese Anforderung zu berechnen.
Die Kartenfunktion spaltet hauptsächlich die zugehörigen Produkte aus, das Ausgabeergebnis ist, dass der Schlüssel Produkt A ist und der Wert Produkt B ist. Das geteilte Ergebnis für die erste und drei Ergebnisse ist in der folgenden Abbildung dargestellt:
Um die Produkte zu zählen, die mit den beiden Waren A und B in Verbindung gebracht werden möchten, liefert die Beziehung zwischen den Waren A und B zwei Ergebnisse, nämlich AB und BA.
Die Reduzierung der Produkte, die die mit Produkt A verbundenen Produkte gruppiert und gezählt haben, dh berechnen, wie oft jedes Produkt im Wert erscheint, und das Ausgabeergebnis ist, dass das Schlüssel Produkt A | Produkt B ist und der Wert die Anzahl der Zeiten dieser Kombination ist. Analysieren Sie für die oben genannten 5 oben genannten Datensätze den Schlüsselwert von R in der Kartenausgabe:
Durch die Verarbeitung der Kartenfunktion wird der in der folgende Abbildung gezeigte Datensatz erhalten:
Der Wertwertausgang in Reduzierung wird gruppiert und gezählt, und das Ergebnis ist in der folgenden Abbildung dargestellt.
Verwenden Sie das Produkt AB als Schlüssel, kombinieren Sie die Anzahl der Produkte als Wert für die Ausgabe, und das Ausgabeergebnis ist in der folgenden Abbildung dargestellt:
Die Analyse des Implementierungsprozesses der Anforderungen ist bisher beendet. Werfen wir einen Blick auf die jeweilige Code -Implementierung unten.
Code -Implementierung:
Ich werde keine detaillierte Einführung in den Code geben. Weitere Informationen finden Sie in den Kommentaren im Code.
Paket com; importieren 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.intwritable; import org.apache.hadoop.io.longwritable; 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; öffentliche Klasse -Test erweitert das Konfigurationswerkzeug { / ** * Kartenklasse, Datenvorverarbeitung implementieren * Der Ausgangsergebnisschlüssel ist Produkt ein Wert und das zugeordnete Produkt b * @author lulei * / public static class mapt erweitert mapper <longwritable, text, text, text, text, {öffentlich void map (longwritable taste, text -Wert). if (! (line == null || "" .Equals (line)) {// Die Produktstring [] vs = line.split ("); // kombinieren die beiden, um einen Datensatz für (int i = 0; i <(vs.Length - 1) zu bilden; vs.Length; Der Ausgabe -Ergebnis ist der Produkt A | B, der die Anzahl der Assoziationen* @Author lulei*/öffentlicher statischer Klassenreduktion ist Reduzierer <Text, Text, Text, intRabble> {private int count; this.count = Integer.ParseInt (countstr); HashMap <String, Integer> HashMap = New HashMap <String, Integer> (); // Hash, um die Anzahl der Produkte zu zählen, die B -Produkte für (Textwert: Werte) {String valuestr = value.toString (); if (hashmap.containsKey (valuestr)) {Hashmap.put (Valuestry, HashMap.get (Valuestr) + 1); } else {HashMap.put (Valuestry, 1); }} // Ausgabe des Ergebnisses für (Eintrag <String, Integer> Eintrag: HashMap.EntrySet ()) {if (Eintrag.getValue ()> = this.count) {// nur Ausgabe context.write (newtext (keyntru +); }}}} @Override public int run (string [] arg0) löst eine Ausnahme aus {// Todo automatisch generierte Methode Stub-Konfiguration conf = getConf (); conf.set ("count", arg0 [2]); Job Job = neuer Job (conf); Job.setJobName ("Jobtest"); Job.SetoutputFormatClass (TextOutputFormat.class); Job.SetoutputKeyClass (text.class); Job.SetoutputValueClass (text.class); Job.SetMapperClass (Mapt.Class); Job.SetReDuCerClass (redoket.class); FileInputFormat.addinputPath (Job, neuer Pfad (arg0 [0])); FileOutputFormat.SetoutputPath (Job, neuer Pfad (arg0 [1])); Job.waitforCompletion (true); return Job.issuccessful ()? 0: 1; } / ** * @param args * / public static void main (string [] args) {// Todo automatisch generierte Methode Stub if (argsgth! = 3) {System.exit (-1); } try {int res = toolrunner.run (new configuration (), New test (), args); System.exit (res); } catch (Ausnahme e) {// Todo automatisch generierter Block E. printstacktrace (); }}} Hochladen und ausführen:
Verpacken Sie das Programm in eine JAR -Datei und laden Sie es in die Maschinengruppe hoch. Laden Sie Testdaten auch in das HDFS -verteilte Dateisystem hoch.
Der Screenshot des ausgeführten Befehls ist in der folgenden Abbildung dargestellt:
Überprüfen Sie nach Abschluss des Laufs das entsprechende HDFS -Dateisystem, wie in der folgenden Abbildung gezeigt:
Hier ist ein komplettes MapReduce -Programm. Ich werde weiter über Hadoop erfahren ~ Danke für das Lesen, ich hoffe, es kann Ihnen helfen. Vielen Dank für Ihre Unterstützung für diese Seite!