我想略微改进以下代码:
val filePathsList = Seq("path_1","path_2)
var seqdf = filePathsList.map(path => {
try {
sqlContext.read.format("json").load(path)
} catch {
case e: Exception => e.printStackTrace()
}
})
现在seqdf
的类型为Any
,因为我添加了try ... catch
。我需要seqdf
属于Seq[DataFrame]
类型,同时在try ... catch
json
文件不存在的情况下保留path
。我怎么能得到它?
答案 0 :(得分:3)
使用flatMap和Option自动删除无效值
var seqdf = filePathsList.flatMap(path => {
try {
Some(sqlContext.read.format("json").load(path))
} catch { case e: Exception =>
e.printStackTrace()
None
}
})
如果你真的不关心堆栈跟踪,那么下面会显示一个更简洁的版本
var seqdf = filePathsList.flatMap(path => {
Try(sqlContext.read.format("json").load(path)).toOption
})
答案 1 :(得分:2)
使用比Java Try
getOrElse
更高效的Scala try
和catch
。如果找不到路径,您可以返回空dataframe
。
import sqlContext.implicits._
var seqdf = filePathsList.map(path => {
Try(
sqlContext.read.format("json").load(path)
) getOrElse Seq.empty[String].toDF()
})
希望这是有帮助的