Java MapReduce代码,用于查找城市的最高温度

Java MapReduce代码,用于查找城市的最高温度,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,问题陈述:使用MapReduce查找每个城市的最高温度 输入: Kolkata,56 Jaipur,45 Delhi,43 Mumbai,34 Goa,45 Kolkata,35 Jaipur,34 Delhi,32 输出: Kolkata 56 Jaipur 45 Delhi 43 Mumbai 34 我编写了以下代码: 地图: 我得到以下错误: 17/06/15 10:44:17 INFO mapred.JobClient: Task Id : attempt_

问题陈述:使用MapReduce查找每个城市的最高温度

输入:

Kolkata,56
Jaipur,45
Delhi,43
Mumbai,34
Goa,45
Kolkata,35
Jaipur,34
Delhi,32
输出:

Kolkata   56
Jaipur    45
Delhi     43
Mumbai    34
我编写了以下代码:

地图:

我得到以下错误:

17/06/15 10:44:17 INFO mapred.JobClient: Task Id : 
attempt_201706151011_0002_m_000000_1, Status : FAILED
java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at Map.map(Map.java:23)
at Map.map(Map.java:1)
at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
atorg.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
at org.apache.hadoop.mapred.Child.main(Child.java:249)

如您所见,我在map函数中得到了java.util.NoSuchElementException。请帮助我处理此异常,并提供修改map()代码的建议。

检查下一个令牌是否存在:

@Override
protected void map(LongWritable key, Text value, Context context)
        throws IOException, InterruptedException {

    StringTokenizer line = new StringTokenizer(value.toString(), ",\t");

    if (line.countTokens() > 0) {
        word.set(line.nextToken());

        if (line.hasMoreTokens())
            max.set(Integer.parseInt(line.nextToken()));

        context.write(word, max);
    }
}

当我尝试MapReduce的这个特定示例时,我注意到的一件事是,最高的值被级联到温度最高的位置之后的所有值

输出与此类似

Delhi   43
Goa     45
Jaipur  45
Kolkata 56
Mumbai  56
与此相反,

Delhi   43
Goa     45
Jaipur  45
Kolkata 56
Mumbai  34
你可以看到孟买的最后一个温度值是56(这是加尔各答的最高温度)

我注意到,这是因为没有为每次调用reduce函数重置temp和max_temperature

在reduce类中的reduce函数中添加以下两行,就在while循环解决此问题之前

temp = 0;
max_temp = Integer.MIN_VALUE; 

是的,OP正在reducer中使用
while(itr.hasNext())
,但映射器中会抛出异常,OP不会检查下一个令牌是否可用。
Delhi   43
Goa     45
Jaipur  45
Kolkata 56
Mumbai  56
Delhi   43
Goa     45
Jaipur  45
Kolkata 56
Mumbai  34
temp = 0;
max_temp = Integer.MIN_VALUE;