java - 出于某种奇怪的原因在 map reduce 程序中获取 NumberFormatException

标签 java hadoop mapreduce

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

我要问的一切都来自 this hadoop tutorial site .我收到 NumberFormatException 错误,但它说它是“空”。

首先,这是输入文件:

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));

在此先感谢您的帮助。如果这是一个简单的错误,希望我没有在浪费人们的时间。

最佳答案

似乎 s.hasMoreTokens() 从一开始就是假的,因此 lasttoken 仍然是 null,因此 NumberFormatException: null 试图解析它时。 此外,如果每个数字之间有一个空格 ' ' 并且您试图用制表符 '\t' 拆分 token ,则不会有任何 token

关于java - 出于某种奇怪的原因在 map reduce 程序中获取 NumberFormatException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42638725/

相关文章:

java - HQL意外的AST节点: {vector} when using an ArrayList as parameter

java - Java 中更改线程优先级需要多长时间?

hadoop - hadoop 公平调度程序的最大池数是多少?

arrays - MongoDB - 对数组参数元素进行操作查询

java - 映射 100% 减少 0% 运行 hadoop 字数

hadoop - 带有新API的Hadoop自定义输入格式

Java正则表达式不一致组

java - IntelliJ 不会编译从文档复制的基本 JavaFX 程序

nosql - 从 HBASE 数据返回聚合

hadoop - 如何限制映射器的数量