Spark:仅在路径存在时读取文件

时间:2017-07-19 14:36:20

标签: scala apache-spark parquet

我正在尝试阅读scala中val paths = Seq[String] //Seq of paths val dataframe = spark.read.parquet(paths: _*) 路径中的文件。下面是示例(伪)代码:

parquet

现在,在上面的序列中,存在一些路径而一些路径不存在。在阅读org.apache.spark.sql.AnalysisException: Path does not exist文件时是否有办法忽略丢失的路径(以避免val filteredPaths = paths.filter(p => Try(spark.read.parquet(p)).isSuccess) )?

我已经尝试了以下它似乎正在工作,但是,然后,我最终读了两次相同的路径,这是我想避免做的事情:

options

我检查DataFrameReader的{​​{1}}方法,但似乎没有任何与ignore_if_missing类似的选项。

此外,这些路径可以是hdfss3(此Seq作为方法参数传递)并且在阅读时,我不知道路径是否为{{1 }}或s3因此无法使用hdfss3特定API来检查是否存在。

2 个答案:

答案 0 :(得分:9)

您可以按@ Psidom的答案过滤掉不相关的文件。在spark中,最好的方法是使用内部spark hadoop配置。鉴于spark会话变量被称为“spark”,您可以这样做:

import org.apache.hadoop.fs.FileSystem
import org.apache.hadoop.fs.Path

val hadoopfs: FileSystem = FileSystem.get(spark.sparkContext.hadoopConfiguration)

def testDirExist(path: String): Boolean = {
  val p = new Path(path)
  hadoopfs.exists(p) && hadoopfs.getFileStatus(p).isDirectory
}
val filteredPaths = paths.filter(p => testDirExists(p))
val dataframe = spark.read.parquet(filteredPaths: _*)

答案 1 :(得分:1)

如何首先过滤paths

paths.filter(f => new java.io.File(f).exists)

例如:

Seq("/tmp", "xx").filter(f => new java.io.File(f).exists)
// res18: List[String] = List(/tmp)
相关问题