2017-06-21 1 views
0

Bonjour, je ne sais pas si mon titre est le meilleur mais je cette liste:une date, mais trier par nom et la valeur dans Apache Hadoop

201505011000######PEN DRIVE01470 
201505011000#######NOTEBOOK11470 
201605011000#######NOTEBOOK21471 
201705011000#######NOTEBOOK21472 
201705011000###GAVETA DE HD01472 
201703011000###GAVETA DE HD01473 

Lorsque, pour par exemple .: 201505 représentent l'année et le mois, après le signe # j'avais le nom du produit, et dans le prix et le 01470 représentent 14,70.

Ce que je dois faire est d'obtenir le prix plus bas pour chaque produit et de montrer l'année et le mois de ce prix. Mais je ne sais pas faire cela, ce que je peux montrer sont le prix inférieur et le produit.

Voici mon programme: MAPPER

package pkg.produto; 

import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 

import java.io.IOException; 

public class MinProdutoMapper 
     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 = line.substring(0, 6); 
     String produto = line.substring(13, 27);//Nome do produto 
     produto = produto.substring(produto.lastIndexOf("#") + 1); 
     //String produto_ano = ano+produto ; 
     int valor = Integer.parseInt(line.substring(27, 32));//Valor do produto 
     context.write(new Text(produto), new IntWritable(valor)); 
    } 
} 

RÉDUCTEUR

package pkg.produto; 

import org.apache.hadoop.io.IntWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Reducer; 

import java.io.IOException; 

public class MinProdutoReducer extends Reducer<Text, IntWritable, Text, IntWritable> { 
    @Override 
    public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { 
     int minValue = Integer.MAX_VALUE; 
     for (IntWritable value : values) { 
      minValue = Math.min(minValue, value.get()); 
     } 
     context.write(key, new IntWritable(minValue)); 
    } 
} 

Quelqu'un peut-il aider?

+0

Vous pouvez donner un coup d'oeil au tri secondaire, puis modifier votre solution. Voici un lien avec un exemple de code qui peut vous aider à résoudre votre problème. secondary-sort – SurjanSRawat

Répondre

-1

Vous pouvez donner un coup d'oeil au tri secondaire, puis modifier votre solution. Voici un lien avec un exemple de code qui peut vous aider à résoudre votre problème. secondary-sort

+1

Le lien que vous avez fourni n'est pas suffisant pour répondre à la question. S'il vous plaît poster ceci comme un commentaire ou l'élaborer pour résoudre le problème. – philantrovert