He estado leyendo libros relacionados con Hadoop en los últimos días. Me siento un poco así, así que he escrito un producto estadísticamente relacionado al imitar el programa WordCount.
Descripción del requisito:
Según la lista de ventas del supermercado, calcule el grado de correlación entre los bienes (es decir, cuente la cantidad de veces que compra los bienes A y los bienes B al mismo tiempo).
Formato de datos:
La lista de ventas de supermercados se simplifica al siguiente formato: una línea representa una lista, y cada producto se divide en ", como se muestra en la figura a continuación:
Análisis de requisitos:
Use MapReduce en Hadoop para calcular este requisito.
La función del mapa divide principalmente los productos asociados, el resultado de la salida es que la clave es el producto A y el valor es el producto B. El resultado dividido para el primero y tres resultados se muestra en la figura a continuación:
Para contar los productos que desean estar asociados con los dos productos A y B, la relación entre los productos A y B produce dos resultados, a saber, AB y BA.
La función Reducir agrupada y contada los productos relacionados con el producto A, es decir, calcule el número de veces que cada producto aparece en el valor, y el resultado de la salida es que la clave es el producto A | Product B, y el valor es el número de veces que ocurre esta combinación. Para los 5 registros mencionados anteriormente, analice el valor clave de R en la salida del mapa:
A través del procesamiento de la función MAP, se obtiene el registro que se muestra en la figura a continuación:
La salida del valor de valor en Reduce se agrupa y cuenta, y el resultado se muestra en la figura a continuación.
Use el producto AB como clave, combine el número de productos como valor para la salida, y el resultado de salida se muestra en la figura a continuación:
El análisis del proceso de implementación de requisitos ha terminado hasta ahora. Echemos un vistazo a la implementación del código específico a continuación.
Implementación del código:
No daré una introducción detallada al código, consulte los comentarios en el código para más detalles.
paquete com; import java.io.ioException; import java.util.hashmap; import java.util.map.entry; importar org.apache.hadoop.conf.configuration; importar org.apache.hadoop.conf.configured; importar org.apache.hadoop.fs.path; importar org.apache.hadoop.io.intwritable; importar org.apache.hadoop.io.longwritable; importar org.apache.hadoop.io.Text; importar org.apache.hadoop.mapreduce.job; importar org.apache.hadoop.mapreduce.mapper; importar org.apache.hadoop.mapreduce.reducer; importar org.apache.hadoop.mapreduce.lib.input.fileInputFormat; importar org.apache.hadoop.mapreduce.lib.output.fileOutputFormat; importar org.apache.hadoop.mapreduce.lib.output.textoutputformat; importar org.apache.hadoop.util.tool; importar org.apache.hadoop.util.toolrunner; La prueba de clase pública extiende la herramienta de implementos configurados { / ** * clase de mapa, implementa el preprocesamiento de datos * La clave de resultado de salida es el producto un valor y el producto asociado B * @author lulei * / public static class Mapt extiende mapper <longwritable, text, text, text> {public void map (clave de longwritable, valor de texto, contexto de contexto) lanza ioexception, interrupción {line de string string line = valle. if (!(line == null || "".equals(line)) { //Split the product String []vs = line.split(","); //Combining the two to form a record for (int i = 0; i < (vs.length - 1); i++) { if ("".equals(vs[i])) {//Exclude empty records continue; } for (int j = i+1; j < vs.length; La clave de resultados es el producto A | B, que es el número de asociaciones* @author lulei*/public static class Reducet extiende Reductor <Text, Text, Intwritable> {private int Count; Integer.ParseInt (countStr);} Catch (Exception e) {this.count = 0; Hashmap <string, integer> hashmap = new Hashmap <String, Integer> (); // use hash para contar el número de productos B para (valor de texto: valores) {string valuestr = value.ToString (); if (hashmap.containskey (valuestr)) {hashmap.put (valuestr, hashmap.get (valuestr) + 1); } else {hashmap.put (valuestr, 1); }} // emite el resultado para (Entry <String, Integer> Entry: Hashmap.EntrySet ()) {if (Entry.getValue ()> = this.count) {// solo de salida context.write (nuevo texto (keyStr + "|" + entry.getkey ()), new intwrite (entry.getValue ())); }}}} @Override public int run (string [] arg0) lanza la excepción {// TODO Método Generado automático Configuración STUB Conf = getConf (); conf.set ("contar", arg0 [2]); Trabajo trabajo = nuevo trabajo (conf); Job.SetJobName ("Jobtest"); Job.SetOutputFormatClass (TextOutputFormat.class); Job.SetOutputKeyClass (text.class); Job.SetOutputValueClass (text.class); Job.SetMapperClass (Mapt.Class); Job.SetEducerClass (reducet.class); Fileinputformat.addinputPath (trabajo, nueva ruta (arg0 [0])); FileOutputFormat.setOutputPath (trabajo, nueva ruta (arg0 [1])); Job.WaitForCompletion (verdadero); devolver Job.issuccessful ()? 0: 1; } / ** * @param args * / public static void main (string [] args) {// toDO stub de método generado automático if (args.length! = 3) {system.exit (-1); } try {int res = toolrunner.run (nueva configuración (), nueva test (), args); System.exit (res); } Catch (Exception e) {// TODO Auto Generado Bloque E.PrintStackTrace (); }}} Subir y ejecutar:
Empaque el programa en un archivo JAR y cárguelo al grupo de máquinas. Cargue datos de prueba en el sistema de archivos distribuido HDFS también.
La captura de pantalla del comando en ejecución se muestra en la siguiente figura:
Una vez completado la ejecución, verifique el sistema de archivos HDFS correspondiente, como se muestra en la figura a continuación:
Aquí hay un programa completo de MapReduce. Continuaré aprendiendo sobre Hadoop ~ Gracias por leer, espero que pueda ayudarlo. ¡Gracias por su apoyo para este sitio!