Spark读取含连续斜杠的S3路径报错,求解决方法
解决Spark读取带连续斜杠的S3路径报错问题
问题描述
源数据存储在S3路径:
s3://mybucket/prefix1/prefix2//prefixX/prefixY/partitionColumn=2023/
执行以下代码读取前缀路径时出现报错:
df = spark.read.json("s3://mybucket/prefix1/prefix2//prefixX/prefixY/")
报错信息:
"Path does not exist: s3://mybucket/prefix1/prefix2/prefixX/prefixY/"
原因是Spark会自动规范化路径,将连续斜杠合并为单个斜杠,导致实际访问的路径与存储路径不匹配。
解决方案
方案1:禁用路径规范化配置
在初始化SparkSession时添加配置,禁止Spark自动规范化路径,保留原始路径中的连续斜杠:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("spark.hadoop.fs.s3a.path.normalization.enabled", "false") \ .getOrCreate() # 现在可以正常读取带连续斜杠的路径 df = spark.read.json("s3://mybucket/prefix1/prefix2//prefixX/prefixY/")
注:如果使用的是s3协议而非s3a,将配置中的s3a替换为s3即可。
方案2:使用通配符匹配目标路径
通过通配符绕过连续斜杠的识别问题,直接匹配目标前缀下的所有数据文件:
# 匹配该前缀下所有JSON文件(递归遍历子目录) df = spark.read.json("s3://mybucket/prefix1/prefix2//prefixX/prefixY/**/*.json") # 或者直接匹配分区路径 df = spark.read.json("s3://mybucket/prefix1/prefix2//prefixX/prefixY/partitionColumn=*")
方案3:通过Hadoop文件系统API获取实际文件路径
直接调用Hadoop的FileSystem API列出目标路径下的所有文件,再将文件路径列表传给Spark读取:
from pyspark.sql import SparkSession from org.apache.hadoop.fs import Path from org.apache.hadoop.conf import Configuration spark = SparkSession.builder.getOrCreate() conf = Configuration() # 获取目标路径的文件系统实例 target_path = Path("s3://mybucket/prefix1/prefix2//prefixX/prefixY/") fs = target_path.getFileSystem(conf) # 列出路径下的所有文件(排除目录) file_status_list = fs.listStatus(target_path) file_paths = [str(status.getPath()) for status in file_status_list if status.isFile()] # 读取文件列表 df = spark.read.json(file_paths)
内容的提问来源于stack exchange,提问作者Aanchal Aron
相关产品推荐
相关产品推荐

