Brian:

Thanks for your response.

I have 8 total keys and values. The code I show below is part of the whole
thing, just to illustrate my problem.

Im trying to call each key with an if statement (as in the piece I showed
before). Each of my 8 keys have their respective if statement.

However, it seems that my if statement is not going through. I even put
the output.collect(...) inside the if statement, and accordingly, no
output was shown. I already tested my mapper, and it seems to work fine.

I believe that I am having difficulty at this point:

if (key.equals("sex")) {...}

The key in this case is "sex" (or gender) and the possible values are 0
(for male) and 1 (for female). Is this not the right way to separate out
my keys?

-Reza

> Hey Reza,
>
>  From reading your code, you are calling this for the key "sex":
>
> output.collect("The total population is: ", (actual population))
>
> and, for every other key:
>
> output.collect("The total population is: ", 0)
>
> You probably only want to call the output collector in the first case,
> not every time.
>
> Brian
>
>
> On Apr 18, 2009, at 12:21 PM, Reza wrote:
>
>> Hello all:
>>
>> I am new to Hadoop and Map Reduce. I am writing a program to analyze
>> some
>> census data.
>>
>> I have a general question with MapReduce:
>>
>> In the Reducer, how can I separate keys to do separate calculations
>> based
>> on the key? In my case, I am trying to use if statements to separate
>> the
>> keys out, but for some reason, it is not doing so.
>>
>> Here is a segment of my code. My mapper seems to work, I think it is
>> my
>> Reducer that is messing up:
>>
>>  public static class MapClass extends MapReduceBase implements
>> Mapper<LongWritable, Text, Text, IntWritable> {
>>
>> //    private final static IntWritable one = new IntWritable(1);
>>        Text sex = new Text("sex");
>>    public void map(LongWritable key, Text value,
>>                    OutputCollector<Text, IntWritable> output,
>>                    Reporter reporter) throws IOException {
>>      String line = value.toString();
>>      StringTokenizer itr = new StringTokenizer(line,",");
>>
>> :
>> :
>>                word.set(itr.nextToken());
>>                IntWritable sexVal = new
>> IntWritable(Integer.parseInt(word.toString()));        //map gender
>>                output.collect(sex, sexVal);
>>
>>    }//end map()method
>>  }//end class MapClass
>>
>>
>>  public static class Reduce extends MapReduceBase
>>    implements Reducer<Text, IntWritable, Text, IntWritable> {
>>
>>
>>    public void reduce(Text key, Iterator<IntWritable> values,
>>                       OutputCollector<Text, IntWritable> output,
>>                       Reporter reporter) throws IOException {
>>
>>                int totalPop    = 0;        //count: total population
>>                int numMales    = 0;        //count: males
>>                int numFemales  = 0;        //count: females
>>                Text popOut     = new Text("The total population is:
>> ");
>>                if (key.equals("sex")) {
>>                        while (values.hasNext()) {
>>                                if (values.next().get() == 0)
>>                                        numMales++;        //number
>> of males
>>                                else
>>                                        numFemales++;        //number
>> of
>> females
>>                        }//end while
>>                totalPop = numMales + numFemales; //count of population
>>                }//end if
>>                output.collect(popOut, new IntWritable(totalPop));
>>
>>    }//end reduce method
>>  }//end class Reduce
>>
>> key is of type Text, I also used: if (key.toString() == "sex) {....
>> but that wasnt working either.
>>
>> There are of course other keys and values, but I would think to
>> gather all
>> the keys "sex" would be done with the way I show it above.  However,
>> My
>> output reads as 0.  I tried changing the numMales value to see if
>> the if
>> statement is executed, but it is not. Am I doing something wrong?
>>
>
>

Reply via email to