java - 映射任务中的 ArrayIndexOutOfBound 异常

标签 java arrays hadoop mapreduce indexoutofboundsexception

我试图将输入值分成 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 作为拆分中的制表 rune 字,而不是 \\t,因为这将尝试根据实际拆分字符串 "\t"。因此:

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

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

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

关于java - 映射任务中的 ArrayIndexOutOfBound 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31750534/

相关文章:

java - 为什么我不断收到 Java.Lang.NullPointerException

python - 无法用numpy reshape 数组

arrays - 如何在 Swift 中生成给定大小的 1 位和 0 位的所有排列

hadoop - Hive - 如何将完整的 html 文件内容加载到单个配置单元行?

Postgresql 星期几的 Java 常量

java - 如何随机显示偶数数组索引

java - JUNG:绘制后将 child 添加到 DelegateTree

java - 删除重复 JAVA 数组的最佳实现

java - maven intellij java mapreduce 测试程序

hadoop - 使用不同的输入值运行相同的协调器