Eu tenho lido livros relacionados ao Hadoop nos últimos dias. Eu me sinto um pouco assim, então escrevi um produto estatisticamente relacionado imitando o programa WordCount.
Descrição do requisito:
De acordo com a lista de vendas do supermercado, calcule o grau de correlação entre as mercadorias (ou seja, conte o número de vezes que você compra mercadorias A e mercadorias B ao mesmo tempo).
Formato de dados:
A lista de vendas de supermercados é simplificada para o seguinte formato: uma linha representa uma lista e cada produto é dividido em "," como mostrado na figura abaixo:
Análise de requisitos:
Use o MapReduce no Hadoop para calcular esse requisito.
A função do mapa divide principalmente os produtos associados, o resultado da saída é que a chave é o produto A e o valor é o produto B. O resultado dividido para o primeiro e três resultados é mostrado na figura abaixo:
Para contar os produtos relacionados aos dois produtos A e B, a relação entre os produtos A e B produz dois resultados, a saber AB e BA.
A função Reduce agrupou e contou os produtos relacionados ao produto A, ou seja, para calcular o número de vezes que cada produto aparece no valor, e o resultado da saída é que a chave é o produto A | Produto B, e o valor é o número de vezes que essa combinação ocorre. Para os 5 registros mencionados acima, analise o valor chave de r na saída do mapa:
Através do processamento da função do mapa, o registro mostrado na figura abaixo é obtido:
A saída do valor do valor em redução é agrupada e contada, e o resultado é mostrado na figura abaixo.
Use o produto AB como chave, combine o número de produtos como valor para a saída e o resultado da saída é mostrado na figura abaixo:
A análise do processo de implementação dos requisitos terminou até agora. Vamos dar uma olhada na implementação específica de código abaixo.
Implementação de código:
Não vou dar uma introdução detalhada ao código, consulte os comentários no código para obter detalhes.
pacote com; importar java.io.ioException; importar java.util.hashmap; importar 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.longwrity; importar org.apache.hadoop.io.text; importar org.apache.hadoop.mapreduce.job; importar org.apache.hadoop.mapreduce.mapper; importar org.apache.hadoop.mapreduce.rededer; importar org.apache.hadoop.mapreduce.lib.input.fileInputFormat; importar org.apache.hadoop.mapreduce.lib.output.fileOutputFormat; importar org.apache.hadoop.mapreduce.lib.output.TextOutFormat; importar org.apache.hadoop.util.tool; importar org.apache.hadoop.util.toolrunner; A classe pública Teste estende a classe de ferramenta IPLEMPENHO { / ** *, implemente o pré -processamento de dados * A tecla de resultado da saída é o produto A Value e o produto associado B * @Author lulei * / public static class mapts estende mapa <longwrity, text, texto, texto> {public void map (chave longwritável, textos, contextwitcent, context.Exception, texto, texto, texto, text> {public void Map (Chave longwritável, contexto). if (! (linha == null || "" .equals (linha)) {// dividir o produto string [] vs = line.split (","); // combinando os dois para formar um registro para (int i = 0; i <(vs.Length - 1); i ++) {if (". Vs. Length; Chave de resultado é o valor A | B, que é o número de associações* @Author Lulei*/classe estática pública Redúcre estende Redutor <Texto, Texto, Texto, Intwrity> {private int conting; Inteiro.parseint (controvância); Hashmap <string, número inteiro> hashmap = new hashmap <string, número inteiro> (); // Use hash para contar o número de produtos B para (Valor do texto: valores) {String valuestr = value.toString (); if (hashmap.containsKey (valuestr)) {hashmap.put (valuestr, hashmap.get (valuester) + 1); } else {hashmap.put (valuestr, 1); }} // em saída o resultado para (Entrada <String, Integer> Entrada: hashmap.entryset ()) {if (Entry.getValue ()> = this.count) {// Somente o contexto de saída.Write (new Text (KEYSTR + "" " + Entry.getKey ()), novo intcrável (ENTRETVAL.); }}}} @Override public int run (string [] arg0) lança Exceção {// TODO Method Auto-Gerated Stub Configuration confing = getConf (); conf.set ("count", arg0 [2]); Trabalho de emprego = novo emprego (conf); job.setJobName ("JobTest"); Job.SetOutputFormAtClass (TextOutputFormat.class); job.setOutputKeyClass (text.class); Job.SetOutputValueclass (text.class); job.setMapPerClass (Mapt.class); Job.SetReducClass (Reducet.class); FileInputFormat.addinputPath (Job, novo caminho (arg0 [0])); FileOutputFormat.setOutputPath (Job, novo caminho (arg0 [1])); Job.WaitForCompletion (true); Retornar Job.issuccessful ()? 0: 1; } / ** * @param args * / public static void main (string [] args) {// TODO Method Method Stub if (args.length! = 3) {System.exit (-1); } tente {int res = Toolrunner.run (new Configuration (), new test (), args); System.Exit (res); } Catch (Exceção e) {// TODO BLOCO DE CAPAGEM AUTOMENTADO E.PRINTSTACKTRACE (); }}} Carregue e execute:
Empacote o programa em um arquivo JAR e envie -o para o grupo de máquinas. Envie os dados do teste para o sistema de arquivos distribuído HDFS.
A captura de tela do comando em execução é mostrada na figura a seguir:
Após a conclusão da execução, verifique o sistema de arquivos HDFS correspondente, conforme mostrado na figura abaixo:
Aqui está um programa completo do MapReduce. Continuarei aprendendo sobre o Hadoop ~ obrigado por ler, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!