java.lang.NumberFormatException:对于输入字符串:“100”,同时执行 MapReduce
java.lang.NumberFormatException: For input string: "100" while executing MapReduce
我正在编写一个 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?我该如何纠正?
编辑:正如您在评论中提到的,您得到的长度是 4
也许你可以试试这个。
LineSplits[0].replace(u'\ufeff', '')
然后尝试解析看看会发生什么
如果你看看 Integer.parseInt() jsl
它说
Throws:
NumberFormatException - if the string does not contain a parsable integer.
如果 string: "100"
到达 ENDOFLINE 会怎么样。它可以有 字符,如 \r\n 或 \n 即 line termination
或 null
如果已到达流的末尾,即 显然不是 "parsable integer"。所以你需要在解析之前检查这些。
您的文件包含无效的 Unicode 字符 'ZERO WIDTH NO-BREAK SPACE' (U+FEFF)。你需要摆脱它。
该角色不可见。所以你没有意识到它在那里是可以理解的。你可能错误地复制粘贴在那里。您必须查看从何处复制数据。
我应该提一下,在代码中修剪字符串并不能消除该字符。你真的需要进入你的输入文件并从那里修复它。
您将在 thread 中找到有关如何摆脱角色的建议。
否则,如果您的文件不是太大,为什么不开始一个新文件,并手动输入您的值以确保安全。 :)
我正在编写一个 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?我该如何纠正?
编辑:正如您在评论中提到的,您得到的长度是 4
也许你可以试试这个。
LineSplits[0].replace(u'\ufeff', '')
然后尝试解析看看会发生什么
如果你看看 Integer.parseInt() jsl 它说
Throws: NumberFormatException - if the string does not contain a parsable integer.
如果 string: "100"
到达 ENDOFLINE 会怎么样。它可以有 字符,如 \r\n 或 \n 即 line termination
或 null
如果已到达流的末尾,即 显然不是 "parsable integer"。所以你需要在解析之前检查这些。
您的文件包含无效的 Unicode 字符 'ZERO WIDTH NO-BREAK SPACE' (U+FEFF)。你需要摆脱它。
该角色不可见。所以你没有意识到它在那里是可以理解的。你可能错误地复制粘贴在那里。您必须查看从何处复制数据。
我应该提一下,在代码中修剪字符串并不能消除该字符。你真的需要进入你的输入文件并从那里修复它。
您将在 thread 中找到有关如何摆脱角色的建议。
否则,如果您的文件不是太大,为什么不开始一个新文件,并手动输入您的值以确保安全。 :)