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

如何通过Glue目录连接在PySpark Glue ETL中执行Redshift存储过程?

在PySpark Glue ETL中通过Glue目录连接执行Redshift SQL语句

下面提供几种实用方案:

方案1:借助from_jdbc_conf的preactions执行SQL(无需写入数据)

如果仅需执行SQL(比如调用存储过程),不需要写入数据,可以构造空DynamicFrame,利用preactions参数在写入前执行目标SQL。

示例代码:

from awsglue.dynamicframe import DynamicFrame
from pyspark.sql.types import StructType

# 构造空DataFrame转换为DynamicFrame
empty_schema = StructType([])
empty_df = spark.createDataFrame([], empty_schema)
empty_dyf = DynamicFrame.fromDF(empty_df, glueContext, "empty_dyf")

# 执行目标SQL
glueContext.write_dynamic_frame.from_jdbc_conf(
    frame=empty_dyf,
    catalog_connection="Redshift_Catalog_Conn",
    connection_options={
        "preactions": "call store_proc();",
        "dbtable": "public.dummy_table",  # 指定Redshift中存在的任意表(空表也可)
        "database": "admin"
    },
    redshift_tmp_dir="s3://glue_etl/tmp/"
)

注意:dbtable必须指定Redshift中已存在的表,否则会触发报错;也可以在preactions里先创建临时表再指定。

方案2:从Glue目录提取连接信息,手动执行SQL

如果需要直接获取Redshift的主机、用户名、密码等信息,可通过Glue API读取连接详情,再构造JDBC连接执行SQL。

示例代码:

import boto3

# 初始化Glue客户端
glue_client = boto3.client('glue', region_name='你的区域')

# 获取Glue目录连接的配置
conn_details = glue_client.get_connection(Name='Redshift_Catalog_Conn')
conn_props = conn_details['Connection']['ConnectionProperties']

# 提取关键连接信息
host = conn_props['HOST']
port = conn_props['PORT']
db_name = conn_props['DATABASE']
user = conn_props['USERNAME']
pwd = conn_props['PASSWORD']

# 构造JDBC URL
jdbc_url = f"jdbc:redshift://{host}:{port}/{db_name}?user={user}&password={pwd}"

# 执行存储过程(通过Spark JDBC)
spark.read.jdbc(
    url=jdbc_url,
    table="(call store_proc()) as temp_result"
)

注意:Glue会自动解密连接中存储的加密密码,无需额外处理;需确保Glue ETL角色拥有glue:GetConnection权限。

方案3:用glueContext.extract_jdbc_conf简化JDBC URL构造

可以直接通过glueContext.extract_jdbc_conf从Glue目录连接中提取并生成JDBC URL,快速执行SQL:

示例代码:

# 提取Glue连接的JDBC配置并执行SQL
spark.read.format("jdbc") \
    .option("url", glueContext.extract_jdbc_conf("Redshift_Catalog_Conn")) \
    .option("query", "call store_proc();") \
    .load()

内容的提问来源于stack exchange,提问作者Nik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:20:41