java.lang.numberformatexception:对于输入字符串,执行mapreduce时为“100”

dy2hfwbg  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(452)

我在写一份mapreduce的工作,在facebook上寻找普通朋友。
这是我的Map器的输入:

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程序代码的一部分:

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)

所以我被困在这里。为什么我会得到一个数字格式异常?我该怎么纠正呢?

oalqel3c

oalqel3c1#

编辑:正如你在评论中提到的,你得到的长度是 4 也许你可以试试。 LineSplits[0].replace(u'\ufeff', '') 然后试着分析,看看会发生什么
如果你看integer.parseint()jsl,它说

Throws:

NumberFormatException - if the string does not contain a parsable integer.

那么如果 string: "100" 到达内弗林。它可以有\r\n或\n即 line termination 或者 null 如果已经到达流的末尾,这显然不是“可解析整数”。所以你需要在解析之前检查这些。

ha5z0ras

ha5z0ras2#

您的文件包含无效的unicode字符“零宽度无中断空格”(u+feff)。你得把它处理掉。
字符不可见。所以你没有意识到它在那里是可以理解的。你可能错把它复制粘贴在那里了。你得看看你从哪里复制的数据。
我应该提一下,在代码中修剪字符串并不能去掉那个字符。你真的需要进入你的输入文件并从那里修复它。
你会发现如何摆脱这个线程中的字符的建议。
否则,如果您的文件不是太大,为什么不启动一个新文件,并手动键入值以确保安全。:)

相关问题