title: I want to show max,min and avg temperature using hadoop
body: <p>My project is to show max,min and avg temperature. I have already done it, but I have to show this functions using group by key. There are 4 radio buttons for Year, month, date and city in my application. If I select one then it will ask me to input the aggregate functions(max,min,avg). For these I need to change my <code>CompositeGroupKey</code> class, but I don't have any idea about that. So please help me, and provide inputs about the changes need to be done with the code.</p>
  
  <p>The driver :</p>
  
  <pre><code>import org.apache.hadoop.io.*;
  import org.apache.hadoop.fs.*;
  import org.apache.hadoop.mapreduce.*;
  import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  
  public class MaxTemperature
  {             
              public static void Main (String[] args) throws Exception
              {
                          if (args.length != 2)
                          {
                                 System.err.println("Please Enter the input and output parameters");
                                 System.exit(-1);
                          }
  
                        Job job = new Job();
                        job.setJarByClass(MaxTemperature.class);
                        job.setJobName("Max temperature");
  
                        FileInputFormat.addInputPath(job,new Path(args[0]));
                        FileOutputFormat.setOutputPath(job,new Path (args[1]));
  
                        job.setMapperClass(MaxTemperatureMapper.class);
                        job.setReducerClass(MaxTemperatureReducer.class);
  
                        job.setMapOutputKeyClass(CompositeGroupKey.class);
                        job.setMapOutputValueClass(IntWritable.class);
  
                        job.setOutputKeyClass(CompositeGroupKey.class);
                        job.setOutputValueClass(DoubleWritable.class);
  
  
                        System.exit(job.waitForCompletion(true)?0:1);
              }
  }
  </code></pre>
  
  <p>The mapper :</p>
  
  <pre><code>import org.apache.hadoop.io.*;
  import org.apache.hadoop.mapreduce.*;
  import java.io.IOException;
  
  public class MaxTemperatureMapper extends Mapper &lt;LongWritable, Text, CompositeGroupKey, IntWritable&gt;
  {
  public void map(LongWritable key, Text value, Context context) throws IOException,  InterruptedException
       {
      String line = value.toString();
      int year = Integer.parseInt(line.substring(0,4));
      String mnth = line.substring(7,10);
      int date = Integer.parseInt(line.substring(10,12));
      int temp= Integer.parseInt(line.substring(12,14));
  
      CompositeGroupKey cntry = new CompositeGroupKey(year,mnth, date);
  
  
      context.write(cntry, new IntWritable(temp));
              }
  }
  </code></pre>
  
  <p>The reducer :</p>
  
  <pre><code>import org.apache.hadoop.io.DoubleWritable;
  import org.apache.hadoop.io.IntWritable;
  import org.apache.hadoop.mapreduce.*;
  import java.io.IOException;
  
  
  public class MaxTemperatureReducer extends Reducer &lt;CompositeGroupKey, IntWritable, CompositeGroupKey, CompositeGroupkeyall &gt;{
  
  
      public void reduce(CompositeGroupKey key, Iterable&lt;IntWritable&gt; values , Context context) throws IOException,InterruptedException
              {
  
  
              Double max = Double.MIN_VALUE;
              Double min =Double.MAX_VALUE;
  
              for (IntWritable value : values  ) 
              {               
                  min = Math.min(min, value.get());
                  max = Math.max(max, value.get());
  
              }
  
              CompositeGroupkeyall val =new CompositeGroupkeyall(max,min);
              context.write(key, val);
              }
  }
  </code></pre>
  
  <p>And the composite key :</p>
  
  <pre><code>import java.io.DataInput;
  import java.io.DataOutput;
  import java.io.IOException;
  
  import org.apache.hadoop.io.WritableComparable;
  import org.apache.hadoop.io.WritableUtils;
  
  class CompositeGroupKey implements WritableComparable&lt;CompositeGroupKey&gt; {
      int year;
      String mnth;
      int date;
      CompositeGroupKey(int y, String c, int d){
          year = y;
          mnth = c;
          date = d;
      }
      CompositeGroupKey(){}
  
      public void write(DataOutput out) throws IOException {
          out.writeInt(year);
          WritableUtils.writeString(out, mnth);
          out.writeInt(date);
          }
      public void readFields(DataInput in) throws IOException {
          this.year = in.readInt();
          this.mnth = WritableUtils.readString(in);
          this.date = in.readInt();
          }
      public int compareTo(CompositeGroupKey pop) {
          if (pop == null)
              return 0;
          int intcnt;
          intcnt = Integer.valueOf(year).toString().compareTo(Integer.valueOf(pop.year).toString());
          if(intcnt != 0){
              return intcnt;
          }else if(mnth.compareTo(pop.mnth) != 0){
              return mnth.compareTo(pop.mnth);
          }else{
              return Integer.valueOf(date).toString().compareTo(Integer.valueOf(pop.date).toString());
          }
      }
      public String toString() {
          return year + " :" + mnth.toString() + " :" + date;
          }   
  }
  
  
  
  
  
  
  
  
  
  import java.io.DataInput;
  import java.io.DataOutput;
  import java.io.IOException;
  
  import org.apache.hadoop.io.WritableComparable;
  class CompositeGroupkeyall implements WritableComparable&lt;CompositeGroupkeyall&gt; {
      Double max;
      Double min;
  
      CompositeGroupkeyall(double x, double y){
          max = x ;
          min = y ;
      }
      CompositeGroupkeyall(){}
  
      public void readFields(DataInput in) throws IOException {
          this.max = in.readDouble();
          this.min = in.readDouble();
      }
  
      public void write(DataOutput out) throws IOException {
          out.writeDouble(max);
  
          out.writeDouble(min);
  
  
          }
  
      public int compareTo(CompositeGroupkeyall arg0) {
          return -1;
      }
  
      public String toString() {
          return max + "   " + min +"   " ;
          }
  }
  </code></pre>