我映射从文本文件中获取的数据。文本文件应该有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条件?
答案 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
,您可以将任意数量的不匹配行作为单独的案例处理。