【问题标题】:java.lang.NumberFormatException: For input string: "100" while executing MapReducejava.lang.NumberFormatException:对于输入字符串:“100”,同时执行 MapReduce
【发布时间】: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


【解决方案1】:

您的文件包含无效的 Unicode 字符“零宽度无间隔”(U+FEFF)。你需要摆脱它。

角色不可见。因此,您没有意识到它的存在是可以理解的。您可能错误地复制粘贴在那里。您必须查看从哪里复制数据。

我应该提到,在代码中修剪你的字符串并不能摆脱那个字符。你真的需要进入你的输入文件并从那里修复它。

您将在此thread 中找到有关如何摆脱角色的建议。

否则,如果您的文件不是太大,为什么不开始一个新的文件,并手动输入您的值以确保安全。 :)

【讨论】:

  • 你看,文件并不总是像它看起来的那样:)
  • 我编辑了输入文件。我所做的只是退格了第一行。所以那个看不见的字符被删除了。现在一切正常文件。感谢您的帮助。
【解决方案2】:

编辑:正如你在评论中提到的,你得到的长度是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 terminationnull,这 显然不是“可解析整数”强>。所以你需要在解析之前检查这些。

【讨论】:

  • 您错过了有关第一次拆分的部分代码。他首先在昏迷时将其分开,然后在下半场的空间中分开。例如。 “100”和“200 300 400 500 600”。然后用空格分割第二个字符串。
猜你喜欢
  • 1970-01-01
  • 2012-12-05
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
相关资源
最近更新 更多