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

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桶的权限

二、使用com.databricks.spark.redshift连接器的正确方式

如果你想用Databricks的Redshift连接器,需要先在Glue作业中补充依赖包,因为Glue默认不包含这个库:

  1. 添加依赖包:
    进入Glue作业的「Job details」页面,找到「Jar libraries」,添加对应Spark版本的jar包(Glue 2.0+通常适配Spark 2.4.x):

    • spark-redshift_2.11-4.0.1.jar
    • RedshiftJDBC42.jar(确保版本兼容,若Glue自带可省略)
    • spark-avro_2.11-4.0.0.jar(连接器的依赖包)
  2. 修正代码格式:
    该连接器的参数规则和原生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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:22:45