出于某种奇怪的原因在地图缩减程序中获取NumberFormatException
不知道为什么我得到此错误。我通过MBP上的brew来安装hadoop 2.7.3。我想我在单节点运行它出于某种奇怪的原因在地图缩减程序中获取NumberFormatException
我问的一切都是从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));
感谢您的帮助。希望如果这是一个简单的错误,我不会浪费人们的时间。
替换所有的字符串的东西似乎s.hasMoreTokens()
是从一开始假,因此lasttoken
试图解析它的时候仍然null
,因此NumberFormatException: null
。 此外,如果每个数字之间的空间' '
和你想的标记与标签'\t'
分裂将不会有任何标记
- TutorialsPoint已过时的代码。它告诉你下载Hadoop 1.2.1?那已经有几年了......请查看官方的Hadoop MapReduce教程。
- 您在复制的数据中没有制表符,只是空格。
- 您可以测试MapReduce外部相同的确切代码。
你可以用这个
if (value == null) return null;
String[] splits = value.toString().split("\\s+");
String year = splits[0];
String lasttoken = splits[splits.length - 1];
thx,愚蠢的我。当我剪切和粘贴时,标签变成了几个空格。我试着摆弄空格,就像你说的那样,没有标记,因为没有标签可以打开。 – Classified
不用担心。那么这是否解决了你的问题? –
- 请确保您的文本文件只有空间的分隔符。
-
更改代码如下所示。
StringTokenizer s = new StringTokenizer(line,"\t");
似乎's.hasMoreTokens()'是从一开始'FALSE',因此'lasttoken'仍然'null',因此'NumberFormatException的:试图解析它的时候null'。另外,如果每个数字之间有一个“空格”,并且您试图用“标签”分割标记,则不会有任何标记。 – jlordo
@jlordo谢谢。我有空格而不是标签b/c愚蠢的我,当我剪切粘贴,标签变成了多个空间。在调试时,我删除了所有空格,并没有考虑将它制作成标签。仍然没有工作,但谢谢指出这一点给我。 – Classified
@jlordo,如果你把你的评论变成答案,我会赞成它,因为我很愚蠢,你指出我的错误。 – Classified