java在MapReduce程序中由于某些奇怪的原因导致numberformatexception

k4emjkb1  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(306)

我不知道为什么会出现这个错误。我通过brew在mbp上安装了hadoop 2.7.3。我想我是在单节点上运行的
我问的所有问题都来自这个hadoop教程网站。我得到一个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));

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

waxmsbnn

waxmsbnn1#

确保文本文件只有空格分隔符。
更改代码如下也可以。 StringTokenizer s = new StringTokenizer(line,"\t");

jyztefdp

jyztefdp2#

看来 s.hasMoreTokens() 因此,从一开始就是假的 lasttoken 遗骸 null 因此 NumberFormatException: null 当试图解析它时。另外,如果有空间 ' ' 在每个数字之间,并且您正尝试使用制表符拆分令牌 '\t' 不会有任何代币

bbuxkriu

bbuxkriu3#

tutorialspoint有过时的代码。它告诉你下载hadoop1.2.1?好几年了。。。去看看官方的hadoopmapreduce教程。
复制的数据中没有选项卡,只有空格。
您可以在mapreduce之外测试相同的代码。
你可以用这个替换所有的字符串

if (value == null) return null;
String[] splits = value.toString().split("\\s+"); 
String year = splits[0];
String lasttoken = splits[splits.length - 1];

相关问题