如何克服java.lang.ArrayIndexOutOfBoundsException错误

时间:2015-10-12 15:28:06

标签: scala apache-spark

我映射从文本文件中获取的数据。文本文件应该有5列。 e.g。

29000000    1   0   2013    1   single-sex
29000000    1   0   2013    1   education
29000000    1   0   2013    1   and
29000000    1   0   2013    1   the
29000000    1   0   2013    1   brain

在我的过程中,我只需要出现在第0和第5列的那些值。所以,为了得到我写的以下内容:

val emp = 
  sc.textFile("\\.txt")
    .map{line => val s = line.split("\t"); (s(5),s(0))}

但是,某些行有时可能不存在第5列,我得到

  

15/10/12 17:19:33 INFO TaskSetManager:在执行者localhost上的阶段0.0(TID 27)中丢失任务27.0:java.lang.ArrayIndexOutOfBoundsException(5)

因此,在我的映射中,如果s(5)存在与否,我应该如何编写if条件?

1 个答案:

答案 0 :(得分:6)

您可以在其间添加filter()

val rdd = 
  sc.textFile("...").map(_.split("\t")).filter(_.size > 5).map(a => (a(0), a(5)))

使用flatMap的另一个选项(结合提取“即时”):

val rdd = sc.textFile("...").flatMap { l => 
  l.split("\t") match {
    case Array(x: String, _, _, _, _, y: String) => Some((x, y))
    case _ => None 
  }
}

条件也可以用 guard 表示(与类Array[String]上的模式匹配一​​起表示:

val rdd = sc.textFile("...").flatMap { l => 
  l.split("\t") match {
    case a: Array[String] if a.size > 5 => Some((a(0), a(5)))
    // Only one column, provide a default for the other
    case a: Array[String] if a.size == 1 => Some((a(0), "default value"))
    // Ignore everything else
    case _ => None 
  }
}

如果是flatMap,您可以将任意数量的不匹配行作为单独的案例处理。