Scala Spark:仅当路径存在时读取文件
我正在尝试读取scala中路径的Scala Spark:仅当路径存在时读取文件,scala,apache-spark,parquet,Scala,Apache Spark,Parquet,我正在尝试读取scala中路径的序列中存在的文件。下面是示例(伪)代码: 现在,在上面的序列中,有些路径存在,而有些不存在。在读取parquet文件时,是否有任何方法可以忽略丢失的路径(以避免org.apache.spark.sql.AnalysisException:路径不存在) 我尝试了下面的方法,似乎效果不错,但后来,我又两次阅读了同一条路径,这是我希望避免做的事情: val filteredPaths = paths.filter(p => Try(spark.read.parqu
序列中存在的文件。下面是示例(伪)代码:
现在,在上面的序列中,有些路径存在,而有些不存在。在读取parquet
文件时,是否有任何方法可以忽略丢失的路径(以避免org.apache.spark.sql.AnalysisException:路径不存在
)
我尝试了下面的方法,似乎效果不错,但后来,我又两次阅读了同一条路径,这是我希望避免做的事情:
val filteredPaths = paths.filter(p => Try(spark.read.parquet(p)).isSuccess)
我检查了DataFrameReader
的options
方法,但它似乎没有任何类似于ignore\u if\u missing
的选项
此外,这些路径可以是hdfs
或s3
(此Seq
作为方法参数传递),并且在读取时,我不知道路径是s3
还是hdfs
,因此不能使用s3
或hdfs
特定的API来检查是否存在。首先过滤路径如何
:
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)
您可以像@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: _*)
路径可以是本地hdfs
路径或s3
路径。不确定File.exists
是否适用于s3
。如果路径是HDFS/s3路径(通常与Spark一起使用),则需要略微不同的API来检查路径是否存在。[@DarshanMehta你比我快了3秒:)@TzachZohar哈哈,是的。我现在已经更新了这个问题。对于S3,您可能需要检查,对于hdfs,您可以看到。根据您的系统设置,您可能需要在get:filesystem.get(新URI(“S3://bucket”)、spark.sparkContext.hadoopConfiguration)
中指定文件系统位置。否则,它可能会创建一个HDFS文件系统,并检查S3文件系统的路径。
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: _*)