2015-10-07 2 views
0

Входные данные:Hadoop MapReduce практика файл

имя, месяц, категория, расходы

hitesh,1,A1,10020 
hitesh,2,A2,10300 
hitesh,3,A3,10400 
hitesh,4,A4,11000 
hitesh,5,A1,21000 
hitesh,6,A2,5000 
hitesh,7,A3,9000 
hitesh,8,A4,1000 
hitesh,9,A1,111000  
hitesh,10,A2,12000 
hitesh,11,A3,71000 
hitesh,12,A4,177000  
kuwar,1,A1,10700 
kuwar,2,A2,17000 
kuwar,3,A3,10070 
kuwar,4,A4,10007 

Человек-накрест общие расходы и рассчитывать уникальные категории потрачены. (Вывод должен выглядеть следующим образом: имя, общие расходы, общее количество уникальных категорий)

, что я попробовал ..... моего код

личностны Wise общей сумма расходов

public class Emp 
    { 
    public static class MyMap extends Mapper<LongWritable,Text,Text,IntWritable> 
    { 
     public void map(LongWritable k,Text v, Context con) 
     throws IOException, InterruptedException 
     { 
     String line = v.toString(); 
     String[] w=line.split(","); 
     String person=w[0]; 
     int exp=Integer.parseInt(w[3]); 
     con.write(new Text(person), new IntWritable(exp)); 
     } 
    } 
    public static class MyRed extends Reducer<Text,IntWritable,Text,IntWritable> 
    { 
     public void reduce(Text k, Iterable<IntWritable> vlist, Context con) 
     throws IOException , InterruptedException 
     { 
     int tot =0; 
     for(IntWrit 

able v:vlist) 
    tot+=v.get(); 
    con.write(k,new IntWritable(tot)); 
    } 
} 
public static void main(String[] args) throws Exception 
{ 
    Configuration c = new Configuration(); 
    Job j= new Job(c,"person-wise"); 
    j.setJarByClass(Emp.class); 
    j.setMapperClass(MyMap.class); 
    j.setReducerClass(MyRed.class); 
    j.setOutputKeyClass(Text.class); 
    j.setOutputValueClass(IntWritable.class); 
    Path p1 = new Path(args[0]); 
    Path p2 = new Path(args[1]); 
    FileInputFormat.addInputPath(j,p1); 
    FileOutputFormat.setOutputPath(j,p2); 
    System.exit(j.waitForCompletion(true) ? 0:1); 
} 

} 

как чтобы получить общее количество уникальных категорий в этой программе и как сделать вывод похожим на имя, общие затраты, общее количество уникальных категорий .. ???

Благодаря

ответ

0

Вы можете создать пользовательские записи pair из IntWritabe и текст один для расходов и других для категории и использовать его в качестве значения карт. Else передает как расходы, так и категорию с некоторым разделителем в одной строке и разделяет их на стороне редуктора.

Как только вы получите эту пару с тем же для суммирования цикла для общих расходов, а для категории поместите всю категорию в набор Java внутри одного и того же цикла, а затем используйте set.size(), чтобы получить число уникальной категории и напечатайте это в context.write. Снова при печати значения уменьшения стороны вы можете следовать той же методике, которая используется для передачи значения карты.

В стороне карты добавьте категорию и расходы с помощью построителя строк и передайте это значение карты.

StringBuilder sb = new StringBuilder(); 
String sep=":"; 
sb.append(w[2]); 
sb.append(sep); 
sb.append(w[3]); 

con.write(new Text(person), new Text(sb.toString())); 

В сторону уменьшения расколоть значение с тем, что используется в стороне карты и суммировать расходы и рассчитать размер набора, созданного с категориями. Код не проверяется, забрасывает переменные, если он пропущен в приведенном ниже коде.

public void reduce(Text k, Iterable<Text> vlist, Context con) 
     throws IOException , InterruptedException 
     { 
     int tot =0; 
     String myval; 
     Strng[] split_val; 
     Set<String> myset=new HashSet<String>(); 
     int uniq_category; 
     StringBuilder sb1 = new StringBuilder(); 
     for(Text v:vlist) 
     { 
     myval=v.toString(); 
     split_val=myval.split(":"); 
     myset.add(split_val[0]); 
     tot+=Integer.ParseInt(split_val[1]); 
     } 
     uniq_category=myset.size(); 
     String sep=" "; 
    sb1.append(uniq_category); 
    sb1.append(sep); 
    sb1.append(tot); 
    con.write(k,new Text(sb1.toString())); 
    } 
} 

Или создать pair с IntWritable и текст для отображения и уменьшить значение, как указано выше.

+0

@aashish_soni Закончили редактировал пост –

+0

@aashish_soni ли это, что помогает в решении вашей проблемы? –

0

Сделали изменения в вашем коде. Надеюсь, это полезно.

public class Emp 
     { 
     public static class MyMap extends Mapper<LongWritable,Text,Text,Text> 
     { 
      public void map(LongWritable k,Text v, Context con) 
      throws IOException, InterruptedException 
      { 
      String line = v.toString(); 
      String[] w=line.split(","); 
      String person=w[0]; 
      int exp=Integer.parseInt(w[3]); 
      con.write(new Text(person), new Text(line)); 
      } 
     } 
     public static class MyRed extends Reducer<Text,Text,Text,Text> 
     { 
      public void reduce(Text k, Iterable<Text> vlist, Context con) 
      throws IOException , InterruptedException 
      { 
      int tot =0; 
      Set<String> cat = new HashSet<String>(); 
      for(Text v:vlist){ 
       String data = v.toString(); 
       String[] dataArray = data.Split(","); 
       tot+ = Integer.parseInt((dataArray[3]); //calculating the total spend 
       cat.add(dataArray[2]);// finding the number of unique categories 

     } 
      con.write(k,new Text(tot.toString()+","+cat.size().toString()));// writing the name,total spend and total unique categories to the output 
    } 
    public static void main(String[] args) throws Exception 
    { 
     Configuration c = new Configuration(); 
     Job j= new Job(c,"person-wise"); 
     j.setJarByClass(Emp.class); 
     j.setMapperClass(MyMap.class); 
     j.setReducerClass(MyRed.class); 
     j.setOutputKeyClass(Text.class); 
     j.setOutputValueClass(IntWritable.class); 
     Path p1 = new Path(args[0]); 
     Path p2 = new Path(args[1]); 
     FileInputFormat.addInputPath(j,p1); 
     FileOutputFormat.setOutputPath(j,p2); 
     System.exit(j.waitForCompletion(true) ? 0:1); 
    } 

    }