PySpark读取S3 Parquet文件时触发URISyntaxException错误求助
问题排查与解决方案
错误根源分析
这个错误的核心是你的Spark配置中某个地方把S3的endpoint错误设置成了包含空格和描述性文字的非法URL https://Cloud Object Storage - Amazon S3 - AWS,而非代码里指定的s3-us-west-2.amazonaws.com。同时你的SparkSession初始化逻辑存在对象混淆问题,也可能导致配置不生效。
修复步骤
1. 修正SparkSession初始化逻辑
代码里将SparkSession对象命名为sc,后续又用它创建SQLContext和新的SparkSession,这会导致配置混乱。正确的初始化方式应该先构建配置,再创建SparkSession。
2. 确保S3配置正确生效
- 确认
key和secret_key变量已正确赋值为有效的AWS凭证 - 检查是否有环境变量(比如
AWS_S3_ENDPOINT)覆盖了代码里设置的endpoint值 - 排查Jupyter环境的Hadoop配置文件(如
core-site.xml)是否存在错误的s3a.endpoint配置
修正后的完整代码
from pyspark.sql import SparkSession from pyspark.conf import SparkConf # 构建S3相关配置 conf = SparkConf() \ .setAppName("classifier") \ .set("fs.s3a.access.key", key) \ .set("fs.s3a.secret.key", secret_key) \ .set("fs.s3a.endpoint", "s3-us-west-2.amazonaws.com") \ .set("com.amazonaws.services.s3.enableV4", "true") \ .set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem") \ .set("fs.AbstractFileSystem.s3a.impl", "org.apache.hadoop.fs.s3a.S3A") \ .set("fs.s3a.connection.maximum", "100") \ .set("fs.s3a.buffer.dir", "/var/tmp/spark") # 创建SparkSession spark = SparkSession.builder.config(conf=conf).getOrCreate() # 读取Parquet文件 path = "s3a://s3test-dev/classifier/final_sample.parquet" df = spark.read.parquet(path)
额外排查点
- 如果使用EMR或托管Spark环境,确认集群的IAM角色具备访问目标S3桶的权限
- 检查
/var/tmp/spark目录是否存在且当前用户有读写权限,若没有则修改fs.s3a.buffer.dir为有权限的目录
内容的提问来源于stack exchange,提问作者pnv
相关产品推荐
相关产品推荐

