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)