Glue作业连接Redshift遇驱动错误,求正确JDBC驱动
解决Glue作业连接Redshift的驱动与配置问题
嘿,我来帮你搞定这个Glue连接Redshift的麻烦!你遇到的问题主要是驱动类指定错误,以及第三方连接器的依赖配置问题,下面一步步给你讲解决方案:
一、使用Glue自带的Redshift JDBC驱动(推荐)
Glue已经预装了Amazon Redshift的官方JDBC驱动,你之前的代码没指定正确的驱动类,才会触发No suitable driver错误。修正后的代码如下:
from pyspark.context import SparkContext from pyspark.sql import SQLContext sc = SparkContext() sql_context = SQLContext(sc) # 确保myjdbc_url格式正确:jdbc:redshift://<集群端点>:<端口>/<数据库名>?user=<用户名>&password=<密码> df1 = sql_context.read \ .format("jdbc") \ .option("url", myjdbc_url) \ .option("driver", "com.amazon.redshift.jdbc42.Driver") # 关键:添加正确的驱动类 .option("query", mnth_query) \ .option("forward_spark_s3_credentials","true") \ .option("tempdir", "s3://my-bucket/sprk") \ .load() print(f"Total recs for month : {mnthval} df1 -> {df1.count()}")
关键注意点:
- 确认
myjdbc_url的标准格式:jdbc:redshift://cluster-name.xxxxxx.region.redshift.amazonaws.com:5439/database_name?user=your_username&password=your_password - Glue作业绑定的IAM角色必须具备:
- 访问目标Redshift集群的权限(比如附加
AmazonRedshiftFullAccess策略,或更精细的自定义权限) - 读写
tempdir指定的S3桶的权限
- 访问目标Redshift集群的权限(比如附加
二、使用com.databricks.spark.redshift连接器的正确方式
如果你想用Databricks的Redshift连接器,需要先在Glue作业中补充依赖包,因为Glue默认不包含这个库:
添加依赖包:
进入Glue作业的「Job details」页面,找到「Jar libraries」,添加对应Spark版本的jar包(Glue 2.0+通常适配Spark 2.4.x):spark-redshift_2.11-4.0.1.jarRedshiftJDBC42.jar(确保版本兼容,若Glue自带可省略)spark-avro_2.11-4.0.0.jar(连接器的依赖包)
修正代码格式:
该连接器的参数规则和原生JDBC不同,url不要包含用户密码,需单独用user和password参数传入:
from pyspark.context import SparkContext from pyspark.sql import SQLContext sc = SparkContext() sql_context = SQLContext(sc) df1 = sql_context.read \ .format("com.databricks.spark.redshift") \ .option("url", "jdbc:redshift://<集群端点>:<端口>/<数据库名>") # 这里不要加user和password .option("user", "your_username") .option("password", "your_password") .option("query", mnth_query) \ .option("forward_spark_s3_credentials","true") \ .option("tempdir", "s3://my-bucket/sprk") \ .load() print(f"Total recs for month : {mnthval} df1 -> {df1.count()}")
之前报连接拒绝的原因:
大概率是你的myjdbc_url包含了用户密码,但Databricks连接器的url参数不支持这种格式,导致解析错误;或者是缺少依赖包,导致连接器无法正常初始化。
额外优化建议:用GlueContext替代SQLContext
在Glue作业中,更推荐使用Glue官方提供的GlueContext,它集成了更多Glue专属功能,代码也更简洁:
import sys from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session df1 = spark.read \ .format("jdbc") \ .option("url", myjdbc_url) \ .option("driver", "com.amazon.redshift.jdbc42.Driver") \ .option("query", mnth_query) \ .option("forward_spark_s3_credentials","true") \ .option("tempdir", "s3://my-bucket/sprk") \ .load()
这种写法更贴合Glue作业的最佳实践哦!
内容的提问来源于stack exchange,提问作者nitinr708
相关产品推荐
相关产品推荐

