Primeiro Código em Java

2 respostas Resolvido
java
L

Olá galera,

Esse é meu primeiro post na comunidade, então, já vou pedindo desculpas casa faça alguma besteira agora. rsrs

Seguinte, estou fazendo curso de big data e em um exercício foi me pedido para escrever um código que analise linhas com 32 caracteres cada e retorne o ano mês. O processamento será feito no Hadoop.
Só que não consegui finalizar o código.

Texto a ser lido no txt:
201505011000######PEN__DRIVE00950

Classe Mapper (Mapeia o arquivo texto .txt)

package menorPreco;

public class MenorPrecoMapper extends Mapper <LongWritable, Text, Text, IntWritable> {

@override
public void map(LongWritable key, Text value, Context context)
	throws IoException, InterruptedException{
		String line = value.toString();
		String ano_mes = line.substring(1,6);
		int precoVenda;
		
		precoVenda = Integer.parseInt(line.substring(28,32));
		context.write(new Text(ano_mes), new IntWritable(precoVenda));
	}

Então, após essa fase, criei outra classe para fazer a redução dos dados:

package menorPreco;

public class MenorPrecoReducer
extends Reducer <Text, IntWritable, Text, IntWritable> {

@override 
	public void reduce(Text key, Iterable<IntWritable> values, Context context)
		throws IOException,
		
		InterruptedException{
			int minValor = Integer.MIN_VALUE;
			for (IntWritable value : values) {
				minValor = Math.min(minValor, value.get());
			}
			context.write(key, new IntWritable(minValor));
		}
}

Ao processar os dados é me retornado um resultado estranho (-[telefone removido]) e deveria ser 0950:

Vocês conseguem me ajudar onde estou errando. Ou seja, porque o java está retornando -[telefone removido].
O Texto 01505 era pra ser na realidade 201505 (maio de 2015), isso imagino que se deve a uma posição errado do médoto substring que deveria estar em “substring(0,6)”, por exemplo.

2 Respostas

R
Solucao aceita

Quando você utiliza o Integer.MIN_VALUE ele atribui o menor valor que é possível ser armazenado no tipo primitivo inteiro que é de -[telefone removido].

Quando você compara com o mínimo atribuído inicialmente, o valor comparado não será menor do que o valor mínimo padrão. Sendo assim, o valor mínimo do inteiro é exibido na saída. Entendo, que você deva substituir o valor Integer.MIN_VALUE por Integer.MAX_VALUE ( o valor máximo é [telefone removido]). Sendo assim, qualquer coisa menor do que este valor passará a ser o novo mínimo.

Você ainda pode colocar um if verificando se o valor foi alterado e alertar o usuário caso o mínimo não tenha sido alterado.

Para saber mais sobre constantes
https://docs.oracle.com/javase/7/docs/api/constant-values.html#java.lang.Integer.MAX_VALUE

L

Obrigado, amigo. Problema resolvido.

Criado 3 de novembro de 2017
Ultima resposta 5 de nov. de 2017
Respostas 2
Participantes 2