我想写一个MapReduce程序来打印给定代码

时间:2017-04-08 13:32:43

标签: mapreduce

数据: 1979 23 23 2 43 24 25 26 26 26 26 25 26 25
1980 26 27 28 28 28 30 31 31 31 30 30 30 29 1981 31 32 32 32 33 34 35 36 36 34 34 34 34

映射器:

public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {

    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
               String line = value.toString(); 
         String lasttoken = null; 
         StringTokenizer s = new StringTokenizer(line,"\t"); 
         String year = s.nextToken(); 

         while(s.hasMoreTokens())
            {
               lasttoken=s.nextToken();
            } 

         int val = Integer.parseInt(lasttoken); 
         context.write(new Text(year), new IntWritable(val)); 

      }
    }

减速机:

 public static class Reduce extends MapReduceBase implements Reducer< Text, IntWritable, Text, IntWritable > 

{

  //Reduce function 
  public void reduce( Text key, Iterator <IntWritable> values, 
     OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException 
     { 
       int val=0; 

        while (values.hasNext()) 
        { 
           val=values.next().get(); 
           { 
              output.collect(key, new IntWritable(val)); 
           } 
        } 

我收到了一个numberFormatException。

1 个答案:

答案 0 :(得分:0)

异常可能就在这里:

trim()

在该语句之前打印该值并查看它是什么。它可能是空的,无效的,或者只是一个数字 一个好的尝试是在lasttoken上调用lasttoken。这将删除前导和尾随空格。它可能有一些额外的空格或换行符。

无论哪种方式,你应该检查s是否为空(如果distances = haversine_np(df.lat, df.lng, target_lat, target_lng) 为空可能会发生),修剪它并使用某种实用工具方法或通过捕获NumberFormatException检查它是否为数字。以有意义的方式处理,以防止程序崩溃。