如何通过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
相关产品推荐
相关产品推荐

