PySpark 3.5集成S3:确定aws-java-sdk与hadoop-aws正确版本
PySpark 3.5 集成S3的JAR包版本匹配与解决方案
核心版本匹配规则
PySpark 3.5默认绑定的Hadoop版本是3.3.4,必须严格遵循以下对应关系:
hadoop-awsJAR版本:必须与Hadoop版本完全一致(即3.3.4)aws-java-sdk-bundleJAR版本:Hadoop 3.3.4依赖的是1.12.592(该bundle包包含所有AWS SDK依赖,无需单独下载其他模块)
验证PySpark绑定的Hadoop版本
先确认你的PySpark实际绑定的Hadoop版本,避免版本差异:
from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() print(spark.sparkContext._jvm.org.apache.hadoop.util.VersionInfo.getVersion())
输出应为3.3.4(如果是其他版本,需对应调整hadoop-aws版本)
具体操作步骤
- 下载对应JAR包:
获取hadoop-aws-3.3.4.jar和aws-java-sdk-bundle-1.12.592.jar - 配置JAR路径:
两种方式任选其一:- 方式一:将JAR包放到PySpark默认jars目录(路径一般为
${CONDA_PREFIX}/lib/python3.12/site-packages/pyspark/jars) - 方式二:在SparkSession中手动指定JAR路径:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("Read from S3") \ .config("spark.jars", "/path/to/hadoop-aws-3.3.4.jar,/path/to/aws-java-sdk-bundle-1.12.592.jar") \ .config("spark.hadoop.fs.s3a.access.key", "AWS_ACCESS_KEY") \ .config("spark.hadoop.fs.s3a.secret.key", "AWS_SECRET_KEY") \ .config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \ .config("spark.hadoop.fs.s3a.endpoint", "s3.us-east-1.amazonaws.com") # 替换为你的S3区域端点 .getOrCreate()
- 方式一:将JAR包放到PySpark默认jars目录(路径一般为
- 测试读取S3数据:
s3_path = "s3a://bucket/file.json" df = spark.read.json(s3_path) df.show()
常见问题排查
- 若出现
ClassNotFoundException:检查hadoop-aws版本是否与Hadoop版本完全一致 - 若出现
NoSuchMethodError:检查aws-java-sdk-bundle版本是否匹配Hadoop对应版本的依赖
替代读取方案
如果不想处理JAR包依赖,可先用boto3下载文件到本地,再用PySpark读取:
import boto3 from pyspark.sql import SparkSession # 下载S3文件到本地 s3 = boto3.client('s3', aws_access_key_id='AWS_ACCESS_KEY', aws_secret_access_key='AWS_SECRET_KEY') s3.download_file('bucket', 'file.json', '/tmp/local_file.json') # PySpark读取本地文件 spark = SparkSession.builder.appName("Read Local File").getOrCreate() df = spark.read.json('/tmp/local_file.json') df.show()
内容的提问来源于stack exchange,提问作者AngryCoder
相关产品推荐
相关产品推荐

