Java MapReduce代码,用于查找城市的最高温度
问题陈述:使用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_
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;