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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:37:20