【发布时间】:2015-06-16 14:58:29
【问题描述】:
我正在编写一个 MapReduce 作业,用于在 facebook 上寻找共同的朋友。
这是我的映射器的输入:
100, 200 300 400 500 600
200, 100 300 400
300, 100 200 400 500
400, 100 200 300
500, 100 300
600, 100
这是我的映射器代码的一部分:
map{
String line = value.toString();
String[] LineSplits = line.split(",");
String[] friends = LineSplits[1].trim().split(" ");
for(int i =0; i<friends.length;i++) {
int friend2 = Integer.parseInt(friends[i]);
System.out.println(friend2);
}
int friend1 = Integer.parseInt(LineSplits[0]);
System.out.println(friend1);
}
当我执行此操作时,我在friend2 中获得了正确的值。 (Intege.parseInt 在这里工作正常)。变量friend1 应该将值设为“100”。但是Integer.ParseInt 不起作用,我收到这样的错误:
java.lang.Exception: java.lang.NumberFormatException: For input string: "100"
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:354)
Caused by: java.lang.NumberFormatException: For input string: "100"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at com.hadoop.CFMapper.map(CFMapper.java:29)
at com.hadoop.CFMapper.map(CFMapper.java:1)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:430)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:366)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:223)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
所以我被困在这里。为什么我会为此收到 NumberFormatException?我该如何解决这个问题?
【问题讨论】:
-
这很奇怪。如果有任何有趣的隐藏字符,如
\n或\r,我希望错误消息能够反映这一点。你能在解析之前打印LineSplits[0].length()吗?它给了你什么? -
尝试打印导致错误的代码。逻辑上说,当尝试解析“100”时它应该可以工作 - 但是可能会有一些隐藏字符,例如“100\n\r”。您总是可以将它们从字符串中替换出来。
-
LineSplits[0].length()返回 4 -
@Mounika_22 只打印字符串。
-
啊!现在可以打印出
(int)LineSplits[0].charAt(n),其中n是0、1、2 和3。这样我们就可以看到隐藏了哪些字符。你不仅有数字。告诉我们你从这 4 个字符中得到了什么。
标签: java exception hadoop mapper