You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyCharm中运行PySpark代码无法访问S3文件的解决请求

PySpark读取AWS S3 CSV文件报错解决方案

我写了一段基础PySpark代码,想直接读取AWS S3存储桶里的CSV文件,但一直报错。用boto3能完成同样操作,但我不想用它,毕竟用Spark就是为了直接处理数据,求解决办法。

我的代码

from pyspark.sql import *

spark = SparkSession.builder.master("local").appName("test").getOrCreate()

spark.sparkContext._jsc.hadoopConfiguration().set("com.amazonaws.services.s3.enableV4", "true")
spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider", \
                                     "com.amazonaws.auth.InstanceProfileCredentialsProvider,com.amazonaws.auth.DefaultAWSCredentialsProviderChain")
spark.sparkContext._jsc.hadoopConfiguration().set("fs.AbstractFileSystem.s3a.impl", "org.apache.hadoop.fs.s3a.S3A")

spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.access.key","mykey")
spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.secret.key","mykey")
spark.sparkContext._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "s3.ap-south-1.amazonaws.com")

data = "s3a://atharv-test/huditest.csv"

authorsDf = spark.read.format('csv').option("header","true").option("inferSchema","true").load(data)

authorsDf.show()

报错信息

py4j.protocol.Py4JJavaError: An error occurred while calling o36.load.
: java.lang.NoSuchMethodError: 'void com.google.common.base.Preconditions.checkArgument(boolean, java.lang.String, java.lang.Object, java.lang.Object)'
at org.apache.hadoop.fs.s3a.S3AUtils.lookupPassword(S3AUtils.java:893)
at org.apache.hadoop.fs.s3a.S3AUtils.lookupPassword(S3AUtils.java:869)

核心原因

这个报错是Guava版本冲突导致的。Spark自带的Guava版本和Hadoop S3A客户端依赖的Guava版本不匹配,引发了方法找不到的异常。

解决办法

1. 用spark-submit指定兼容依赖(推荐)

先通过spark-submit --version查看你的Spark内置Hadoop版本,比如显示是3.3.4,就用以下命令启动脚本:

spark-submit --packages org.apache.hadoop:hadoop-aws:3.3.4,com.amazonaws:aws-java-sdk-bundle:1.12.267 your_script.py

该命令会自动下载和Spark内置Hadoop版本匹配的依赖包,覆盖冲突的Guava版本。

2. 排除项目依赖中的冲突Guava

如果是用Maven/SBT构建项目,排除Spark自带的Guava,引入Hadoop对应的版本:

  • Maven示例:
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.12</artifactId>
    <version>3.3.0</version>
    <exclusions>
        <exclusion>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.hadoop</groupId>
    <artifactId>hadoop-aws</artifactId>
    <version>3.3.4</version>
</dependency>

3. 优化代码中的凭证配置

你的代码同时配置了实例角色凭证和Access Key,建议二选一:

  • 如果在EC2/EMR上运行,保留InstanceProfileCredentialsProvider即可,删掉Access Key的配置,更安全;
  • 如果是本地调试,保留Access Key,或者直接用AWS CLI配置的默认凭证(无需在代码里写密钥)。

内容的提问来源于stack exchange,提问作者Aditya Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 05:11:11