Apache spark Spark:读取多个文件并忽略丢失的文件

Apache spark Spark:读取多个文件并忽略丢失的文件,apache-spark,Apache Spark,我有一个数组[String],其中包含一些文件的路径。 数组是自动生成的,因此不能保证文件存在 我希望读取所有这些路径,将现有路径加载到RDD中,并忽略不存在的路径 我已尝试做以下工作: import scala.util.Try val arrayOfFilePaths: Array[String] = ["path1", "path2", "path3", "path4"] val allRecords = sc.union(arrayOfFilePaths.map(p => Try

我有一个
数组[String]
,其中包含一些文件的路径。 数组是自动生成的,因此不能保证文件存在

我希望读取所有这些路径,将现有路径加载到RDD中,并忽略不存在的路径

我已尝试做以下工作:

import scala.util.Try

val arrayOfFilePaths: Array[String] = ["path1", "path2", "path3", "path4"]
val allRecords = sc.union(arrayOfFilePaths.map(p => Try(sc.textFile(p))).filter(_.isSuccess).map(_.get))
但是它似乎没有成功地避免不存在的文件,当我尝试
allRecords.collect()时,我得到了以下错误:


这里有什么问题吗?

好的,我已经找到了解决办法

在加载文件之前,我已经过滤了数组

import java.nio.file.{Paths, Files}

val filteredPaths = arrayOfFilePaths.filter(p => Files.exists(Paths.get(p))).mkString(",")
然后我可以加载这些文件

val allRecords = sc.textFile(filteredPaths)

此筛选不起作用的原因是spark的惰性:
sc.textFile(p)
是惰性的-它返回一个RDD而没有实际读取该文件(尚未),因此
Try(sc.textFile(p))
返回一个
Success
对象,无论文件是否存在,都不会过滤掉任何内容。然后,当您调用
collect
-此时实际发生读取,并且过滤器捕捉失败已经太晚了。你的答案确实是正确的。很好的解释@TzachZohar,谢谢!
val allRecords = sc.textFile(filteredPaths)