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条件?
您可以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
您可以处理任意数量的不匹配行作为单独的案例.
归档时间: |
|
查看次数: |
3377 次 |
最近记录: |