使用Scala检测Parquet文件存在却返回false的问题如何解决
异常原因
- 原生Java/Scala的
java.io.File、scala.reflect.io.File是本地文件系统专属API,仅能识别操作系统本地路径,无法识别dbfs://、hdfs://、s3://等分布式存储路径,所以必然返回false。 - Hadoop FileSystem默认的
get(config)方法会读取默认文件系统配置,如果你的目标路径所属的文件系统和默认配置不一致,就会出现路径解析错误,返回不存在。
正确解决方案
方案1:通用分布式路径存在性校验
通过路径自身获取对应的FileSystem实例,避免默认配置匹配错误:
import org.apache.hadoop.fs.Path // 注意路径必须补全schema前缀,例如DBFS路径写为 dbfs:/xxx/xxx,不要省略前缀 val targetPath = "dbfs:/your/complete/target/path" val path = new Path(targetPath) // 用路径对应的FileSystem实例做校验,不要用全局get方法 val fs = path.getFileSystem(sc.hadoopConfiguration) val existCheck = fs.exists(path)
方案2:Delta表专属存在性校验
如果你的目标路径是Delta表存储路径,直接用Delta Lake自带API校验,同时可验证路径是合法Delta表:
import io.delta.tables._ val deltaTableExists = DeltaTable.isDeltaTable(spark, targetPath)
返回值为true时,说明路径不仅存在,且包含合法的Delta表元数据。
注意事项
- 若目标路径是云存储挂载路径,需确保当前执行账号有该路径的读取权限,无权限场景下部分存储实现会直接返回false而非权限异常。
- 不要用driver节点本地的shell命令校验分布式路径,本地环境无法识别分布式存储挂载映射。
内容的提问来源于stack exchange,提问作者Sharyu Aadhatrao
相关产品推荐
相关产品推荐

