【问题标题】:ArrayIndexOutOfBound Exception in map task地图任务中的 ArrayIndexOutOfBound 异常
【发布时间】:2015-07-31 16:03:59
【问题描述】:

我正在尝试将输入值分成 3 个部分,并将每个部分分配给一个单独的字符串并对其进行一些操作。但是我得到了 ArrayIndexOutOfBound 异常,我无法弄清楚原因。

映射器:

public void map (Object Key, Text value,Context context )throws IOException,InterruptedException{

    String text=value.toString();
    String date =null;
    String parts[]=tweet.split("\\t");
    String sentence= parts[0].toString();

    for(int i=0;i<parts.length;i++) {
        System.out.println("part "+i+parts[i]);
    }

    if(parts.length>0){
        date=parts[1];
    }

    word.set(date);
    context.write(word, one);
}

堆栈跟踪:

2015-07-31 16:50:50,288 INFO  [Thread-11] mapred.LocalJobRunner (LocalJobRunner.java:run(397)) - Map task executor complete.
2015-07-31 16:50:50,295 WARN  [Thread-11] mapred.LocalJobRunner (LocalJobRunner.java:run(482)) - job_local467783972_0001
java.lang.Exception: java.lang.ArrayIndexOutOfBoundsException: 1
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:403)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 1      
    *at sw$TweetMapper.map(sw.java:103)* --> points to date=parts[1]
    at sw$TweetMapper.map(sw.java:1)
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:339)
    at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:235)
    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)

parts[] 长度大于 0,但即使这样分配也会导致错误。任何帮助将不胜感激。

【问题讨论】:

  • 输入 - 一些文本 \t 11-12-2014 \t 一些文本
  • 您的异常位于 sw.java 文件的第 103 行
  • if(parts.length&gt;0){ date=parts[1]; } 你知道这个检查不够吗?如果length == 1,那么parts[1]; 会抛出上面提到的异常......所以我猜你不知道,这是不够的。
  • @DeepakGoyal :是的,第 103 行是 date=parts[1]
  • @Tom:感谢您指出!

标签: java arrays hadoop mapreduce indexoutofboundsexception


【解决方案1】:

我相信您应该使用\t 作为拆分中的制表符文字,而不是\\t,因为这将尝试拆分实际字符串"\t"。因此:

String parts[] = tweet.split("\t");

parts.length &gt; 0 不足以保护您免受越界异常的影响。正如您在案例中看到的那样,仅仅因为长度大于零并不意味着parts[1] 处有一个元素;您应该检查长度是否大于 1:

if(parts.length > 1) {
    date = parts[1];
}

【讨论】:

  • 谢谢!但是使用“\\t”没有问题。它给了我预期的输出。就像汤姆和你提到的那样,问题在于检查不足, if(parts.length > 0) ,当我将其更改为 if(parts.length > 1) 时,没有问题。
  • @Tom 哇,我的立场是正确的。我想这确实有效!
  • @VivinPaliath 我猜是这样:D。而且我猜 OPs tweet 没有“真正的”标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多