PySpark通配符读取多个sas7bdat文件报不存在错误如何解决
问题根因
你遇到的通配符路径读取报错,核心原因是com.github.saurfang.sas.spark第三方SAS读取连接器的旧版本未对接Spark内置的文件系统通配符解析逻辑,会直接把带*的字符串当做完整绝对文件路径做存在性校验,自然触发文件不存在报错。另外如果是本地文件读取场景,未显式指定file://协议前缀,也可能因为Spark默认读取分布式文件系统导致路径找不到。
可行解决方案
- 方案1:手动枚举匹配文件后传入读取(最稳定,无版本兼容问题)
不要直接在load路径里写通配符,先通过Hadoop FileSystem API枚举目录下所有符合命名规则的文件,把完整路径拼成列表传入load方法,Spark会自动合并同schema的文件数据:
Scala版本实现代码:
PySpark版本实现代码:import org.apache.hadoop.fs.{Path, PathFilter} val hadoopConf = spark.sparkContext.hadoopConfiguration val fs = org.apache.hadoop.fs.FileSystem.get(hadoopConf) val baseDir = new Path("/users/shobhana/sas_files/") // 自定义文件名匹配规则 val fileFilter = new PathFilter { override def accept(path: Path): Boolean = { val fileName = path.getName fileName.startsWith("filename_") && fileName.endsWith(".sas7bdat") } } val validFiles = fs.listStatus(baseDir, fileFilter).map(_.getPath.toString) // 传入路径列表读取合并 val mergedDf = spark.read .format("com.github.saurfang.sas.spark") .option("mergeSchema", "true") // 兼容轻微schema差异 .load(validFiles: _*)from py4j.java_gateway import java_import java_import(spark._jvm, "org.apache.hadoop.fs.Path") java_import(spark._jvm, "org.apache.hadoop.fs.PathFilter") hadoop_conf = spark._jsc.hadoopConfiguration() fs = spark._jvm.org.apache.hadoop.fs.FileSystem.get(hadoop_conf) base_dir = spark._jvm.Path("/users/shobhana/sas_files/") # 自定义文件名匹配规则 class SasFileFilter(spark._jvm.PathFilter): def accept(self, path): file_name = path.getName() return file_name.startswith("filename_") and file_name.endswith(".sas7bdat") file_statuses = fs.listStatus(base_dir, SasFileFilter()) valid_paths = [status.getPath().toString() for status in file_statuses] merged_df = spark.read \ .format("com.github.saurfang.sas.spark") \ .option("mergeSchema", "true") \ .load(*valid_paths) - 方案2:补全本地文件协议前缀
如果你是在本地模式下读取本机磁盘文件,在路径前显式加file://协议头(注意是三个斜杠,对应本地根路径),再尝试通配符读取,写法如下:
该方案仅对新版本的spark-sas连接器生效,旧版本仍会因为不支持通配符解析报错。val mergedDf = spark.read .format("com.github.saurfang.sas.spark") .load("file:///users/shobhana/sas_files/filename_*.sas7bdat")
注意事项
读取前确认所有目标sas7bdat文件的字段定义一致,若存在个别文件新增/缺失字段的情况,加上mergeSchema参数即可自动对齐字段,缺失值填充为null。
内容的提问来源于stack exchange,提问作者Bheemineti Shobhana
相关产品推荐
相关产品推荐

