使用PySpark读取AWS S3存储桶CSV文件报s3协议无对应文件系统如何解决
Spark 3.1.0 读取S3文件报错修复方案
这个报错是三个原因共同导致:依赖版本与Spark内置Hadoop版本不兼容、环境变量配置时机错误、S3协议前缀与实现不匹配,可按以下步骤修复:
1. 确认匹配的依赖版本
Spark 3.1.0 默认内置绑定的是 Hadoop 3.2 版本,必须选用版本完全匹配的S3相关依赖,否则会出现类缺失、接口不兼容问题:
- 对应hadoop-aws依赖版本为
org.apache.hadoop:hadoop-aws:3.2.0 - 匹配的AWS SDK版本为
com.amazonaws:aws-java-sdk-bundle:1.11.375(推荐使用bundle全量包,避免拆分包的依赖缺失问题)
2. 调整配置顺序与协议规范
PYSPARK_SUBMIT_ARGS 环境变量必须在导入pyspark包、初始化SparkSession之前设置才会生效,同时hadoop-aws默认实现的是s3a协议,直接用s3://前缀会无法识别文件系统。
3. 完整可运行代码示例
# 环境变量配置必须放在代码最顶部,优先执行 import os os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages org.apache.hadoop:hadoop-aws:3.2.0,com.amazonaws:aws-java-sdk-bundle:1.11.375 pyspark-shell' # 再导入pyspark相关包初始化会话 from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() # 可选:本地运行无默认IAM权限时,添加S3访问密钥配置 sc = spark.sparkContext sc._jsc.hadoopConfiguration().set("fs.s3a.access.key", "你的AWS_ACCESS_KEY_ID") sc._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "你的AWS_SECRET_ACCESS_KEY") # 运行在EC2/EMR等自带IAM角色授权的环境时,可省略上面两行配置 # 文件路径前缀替换为s3a即可正常读取 file = "s3a://bucket/file.csv" c = spark.read.csv(file).count() print(c)
可选适配:保留s3://前缀
如果不想修改已有代码里的s3://路径,可额外添加一行协议映射配置:
sc._jsc.hadoopConfiguration().set("fs.s3.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
配置完成后可直接使用s3://前缀读取S3文件。
内容的提问来源于stack exchange,提问作者Vladimir Shadrin
相关产品推荐
相关产品推荐

