如何让spark忽略丢失的输入文件?

时间:2015-11-10 16:40:52

标签: hadoop apache-spark

我想在包含avro文件的一些生成的S3路径上运行一个spark作业(spark v1.5.1)。我用它们加载它们:

val avros = paths.map(p => sqlContext.read.avro(p))

但有些路径不存在。我如何能够忽略那些空路径?以前我使用过this answer,但我不确定如何在新的数据框API中使用它。

注意:我理想地寻找一种类似于链接答案的方法,它只是使输入路径可选。我并不特别想要明确检查S3中是否存在路径(因为这很麻烦,可能会使开发变得尴尬),但我想如果有这样的话,那就是我的后备。没有干净的方法来实现这一点。

1 个答案:

答案 0 :(得分:11)

我会使用scala Try类型来处理读取avro文件目录时失败的可能性。使用'Try',我们可以在代码中明确失败的可能性,并以功能方式处理它:

object Main extends App {

  import scala.util.{Success, Try}
  import org.apache.spark.{SparkConf, SparkContext}
  import com.databricks.spark.avro._

  val sc = new SparkContext(new SparkConf().setMaster("local[*]").setAppName("example"))
  val sqlContext = new org.apache.spark.sql.SQLContext(sc)

  //the first path exists, the second one doesn't
  val paths = List("/data/1", "/data/2")

  //Wrap the attempt to read the paths in a Try, then use collect to filter
  //and map with a single partial function.
  val avros =
    paths
      .map(p => Try(sqlContext.read.avro(p)))
      .collect{
        case Success(df) => df
      }
  //Do whatever you want with your list of dataframes
  avros.foreach{ df =>
    println(df.collect())
  }
  sc.stop()
}