如何克服java.lang.ArrayIndexOutOfBoundsException错误

mle*_*dan 0 scala apache-spark

我映射从文本文件中获取的数据.文本文件应该有5列.例如

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Ber*_*ium 6

您可以filter()在两者之间添加:

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

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

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

这个条件也可以用一个警卫来表达(和课堂上的模式匹配一​​起表示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 
  }
}
Run Code Online (Sandbox Code Playgroud)

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