在Spark环境的Jupyter Notebook中执行脚本时无法从PySpark获取数据
我来帮你排查几个常见的问题点,应该能解决你从Redshift读取数据失败的问题:
首先先给你一个修正后的代码示例,然后逐个解释关键问题:
from pyspark.conf import SparkConf from pyspark.sql import SparkSession # 用SparkSession统一初始化上下文(新版Spark推荐方式) spark = SparkSession.builder \ .appName("RedshiftDataLoad") \ # 配置依赖包,版本要匹配你的Spark/Scala版本,这里示例是Spark3.3+Scala2.12 .config("spark.jars.packages", "com.databricks:spark-redshift_2.12:5.0.0,org.apache.hadoop:hadoop-aws:3.3.4,com.amazonaws:aws-java-sdk-bundle:1.12.262") \ .getOrCreate() # 切换到更推荐的s3a协议配置S3凭证 spark._jsc.hadoopConfiguration().set("fs.s3a.access.key", "xxxx") spark._jsc.hadoopConfiguration().set("fs.s3a.secret.key", "uyuu") # 读取Redshift数据,补全关键配置 df = spark.read \ .format("com.databricks.spark.redshift") \ # 补全完整的Redshift URL,包含端口、库名和SSL配置 .option("url", "jdbc:redshift://your-cluster-endpoint:5439/your-db-name?ssl=true&sslmode=require") \ .option("dbtable", "index") \ # 必须配置S3临时目录(连接器依赖这个做数据中转) .option("tempdir", "s3a://your-s3-bucket/path/to/temp-folder/") \ .option("forward_spark_s3_credentials", "true") \ .load() # 测试读取结果 df.show()
关键问题解析:
缺失临时目录配置
Spark Redshift连接器必须通过S3临时目录来中转数据,你的代码里完全没指定tempdir选项,这是最核心的缺失项。一定要填一个你有权限读写的S3路径,格式用s3a://bucket/path/。Spark上下文初始化方式过时
新版Spark(2.x及以上)已经统一用SparkSession来管理上下文,单独使用SQLContext(sc)容易出现上下文冲突或者配置不生效的问题,建议换成SparkSession初始化。S3协议选择错误
s3n是比较老旧的S3协议实现,现在AWS和Hadoop社区都推荐用s3a,它支持更大文件、更好的性能和更多功能。记得把配置里的fs.s3n.xxx改成fs.s3a.access.key和fs.s3a.secret.key。Redshift URL不完整
你写的jdbc:redshift://xxxx缺少了端口号、数据库名,而且Redshift默认要求SSL连接,所以完整的URL格式应该包含这些信息,不然连不上集群。依赖包是否齐全
确保你的Spark环境加载了正确版本的依赖包:spark-redshift包要匹配你的Scala和Spark版本(比如Spark3.3对应Scala2.12,包版本选5.0.0)hadoop-aws和aws-java-sdk-bundle是连接S3必须的依赖,版本要和你的Hadoop版本匹配
权限验证
最后检查下权限:- 你的AWS密钥要有S3临时目录的读写权限,以及Redshift目标表
index的SELECT权限 - 如果开启了
forward_spark_s3_credentials,要确保Redshift的IAM角色允许接收Spark传递的凭证
- 你的AWS密钥要有S3临时目录的读写权限,以及Redshift目标表
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

