得到'Any`而不是Seq [DataFrame]

时间:2017-05-11 18:53:46

标签: scala apache-spark apache-spark-sql

我想略微改进以下代码:

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。我怎么能得到它?

2 个答案:

答案 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 trycatch。如果找不到路径,您可以返回空dataframe

import sqlContext.implicits._

var seqdf = filePathsList.map(path => {
  Try(
    sqlContext.read.format("json").load(path)
  ) getOrElse Seq.empty[String].toDF()
})

希望这是有帮助的