I have written a Driver, Mapper and Reducer program to try the composite key (more than one field in a input dataset).
The dataset looks like this:
Country, State, County, Population(in millions)
USA,CA,Alameda,12
USA,CA,Santa Clara,14
USA,AZ,Abajd,14
I am trying to find out the total population in country+state. So the reducer should aggregate on two fields Country+State and show the population.
While I am iterating thru population at the step (in the reducer code)
for(IntWritable i:values)
I am getting the compiler error "Can only iterate over an array or an instance of java.lang.Iterable"
So we can't get iterator on IntWritable? I was able get Iterator work on a FloatWritable data type.
Thanks much nath
import java.io.DataInput;
import java.io.DataOutput;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class CompositeKeyReducer extends Reducer<Country, IntWritable, Country, FloatWritable> {
// public class CompositeKeyReducer extends Reducer<Country, IntWritable, Country, IntWritable> {
public void reduce(Country key, Iterator<IntWritable> values, Context context) throws IOException, InterruptedException {
int numberofelements = 0;
int cnt = 0;
while (values.hasNext()) {
cnt = cnt + values.next().get();
}
//USA, Alameda = 10
//USA, Santa Clara = 12
//USA, Sacramento = 12
float populationinmillions =0;
for(IntWritable i:values)
{
populationinmillions = populationinmillions + i.get();
numberofelements = numberofelements+1;
}
// context.write(key, new IntWritable(cnt));
context.write(key, new FloatWritable(populationinmillions));
}
}