Windows下PySpark读取S3报No FileSystem for scheme: s3如何解决
问题解决与版本匹配方法
核心问题原因
你当前的报错是hadoop-aws、aws-java-sdk与Spark内置Hadoop版本不兼容导致的,且缺少必要的S3文件系统配置。
版本匹配规则
针对你现有PySpark 2.4.8环境,版本对应要求如下:
- PySpark 2.4.8 内置绑定的 Hadoop 版本为 2.7.7,
hadoop-aws版本必须与Spark内置Hadoop版本完全一致 - hadoop-aws 2.7.7 匹配的
aws-java-sdk版本为 1.7.4
你当前使用的hadoop-aws 2.7.3、aws-java-sdk 1.8.2均不符合匹配要求,是报错的直接原因。
具体修复步骤
- 替换依赖jar包
- 删掉Spark的jars目录中原有
hadoop-aws-2.7.3.jar、aws-java-sdk-1.8.2.jar - 放入对应版本的
hadoop-aws-2.7.7.jar、aws-java-sdk-1.7.4.jar
- 删掉Spark的jars目录中原有
- 新增SparkSession配置
创建SparkSession时添加S3文件系统与认证配置,示例代码如下:import findspark findspark.init() from pyspark.sql import SparkSession spark = SparkSession.builder.appName("my_app") \ # 配置s3协议的文件系统实现类 .config("spark.hadoop.fs.s3.impl", "org.apache.hadoop.fs.s3native.NativeS3FileSystem") \ # 可选:推荐使用s3a协议,性能和兼容性更好,开启后读取路径前缀改为s3a:// # .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \ # 配置AWS访问密钥,也可提前配置在系统环境变量中 .config("spark.hadoop.fs.s3.awsAccessKeyId", "你的AWS访问密钥ID") \ .config("spark.hadoop.fs.s3.awsSecretAccessKey", "你的AWS访问密钥") \ .getOrCreate() - 验证读取逻辑
配置完成后,即可正常读取S3数据:# 如开启s3a配置,前缀改为s3a://bucket_name input_bucket = "s3://bucket_name" data = spark.read.csv(input_bucket + '/file_name', header=True, inferSchema=True)
通用版本选择方法
后续遇到同类版本匹配问题,可按以下步骤确认对应版本:
- 执行以下代码获取当前Spark内置的Hadoop版本,hadoop-jar版本必须与该值完全一致:
# 启动pyspark后执行 print(sc._jvm.org.apache.hadoop.util.VersionInfo.getVersion()) - 查找对应hadoop-aws版本依赖的aws-java-sdk版本,保证两个jar包版本严格匹配即可。
内容的提问来源于stack exchange,提问作者Malina Dale
相关产品推荐
相关产品推荐

