Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark:仅当路径存在时读取文件_Scala_Apache Spark_Parquet - Fatal编程技术网

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

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

我正在尝试读取scala中路径的
序列中存在的文件。下面是示例(伪)代码:

现在,在上面的序列中,有些路径存在,而有些不存在。在读取
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: _*)