由于某些奇怪的原因,在map reduce程序中获取NumberFormatException

时间:2017-03-07 01:44:37

标签: java hadoop mapreduce

不确定我为什么会收到此错误。我在MBP上通过brew安装了hadoop 2.7.3。我想我是在单节点中运行它

我所询问的一切都来自this hadoop tutorial site。我收到了NumberFormatException错误,但它说它已经" null"。

首先,这是输入文件:

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
1984 39 38 39 39 39 41 42 43 40 39 38 38 40
1985 38 39 39 39 39 41 41 41 00 40 39 39 45

每个整数之间只有一个空格。唯一奇怪的是单位数字,但不是空的。

接下来,这是运行程序时收到的错误消息:

snip snip
snip snip
17/03/06 17:21:40 WARN mapred.LocalJobRunner: job_local1731001664_0001
java.lang.Exception: java.lang.NumberFormatException: null
    at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)
Caused by: java.lang.NumberFormatException: null      // complains something is null here
    at java.lang.Integer.parseInt(Integer.java:454)
    at java.lang.Integer.parseInt(Integer.java:527)
    at com.servicenow.bigdata.ProcessUtil$E_EMapper.map(ProcessUtil.java:35)
    at com.servicenow.bigdata.ProcessUtil$E_EMapper.map(ProcessUtil.java:16)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
    at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

snip snip
snip snip

最后,这是上述违规行/功能的片段:

  public void map(LongWritable key, Text value,  // offending line #16 here
  OutputCollector<Text, IntWritable> output,   
  Reporter reporter) throws IOException 
  { 
     String line = value.toString(); 
     String lasttoken = null; 
     StringTokenizer s = new StringTokenizer(line,"\t"); 
     String year = s.nextToken(); 

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

     int avgprice = Integer.parseInt(lasttoken);  // offneding #35 line here
     output.collect(new Text(year), new IntWritable(avgprice));

提前感谢您的帮助。希望如果这是一个简单的错误,我不会浪费时间。

3 个答案:

答案 0 :(得分:1)

  1. TutorialsPoint已经过时了。它告诉你下载Hadoop 1.2.1?这已经有好几年了......去查看官方的Hadoop MapReduce教程。
  2. 您复制的数据中没有标签,只有空格。
  3. 您可以在MapReduce之外测试相同的确切代码。
  4. 您可以使用此

    替换所有字符串内容
    if (value == null) return null;
    String[] splits = value.toString().split("\\s+"); 
    String year = splits[0];
    String lasttoken = splits[splits.length - 1]; 
    

答案 1 :(得分:1)

从一开始,s.hasMoreTokens()似乎是假的,因此lasttoken仍然是null,因此NumberFormatException: null在尝试解析它时。 此外,如果每个号码之间有一个空格' ',并且您尝试使用标签'\t'拆分标记,则不会有任何标记

答案 2 :(得分:0)

  1. 确保您的文本文件只有空格分隔符。
  2. 更改代码,因为以下也有效。

    StringTokenizer s = new StringTokenizer(line,"\t");