请求协助开发Python版Glue作业:读取S3中SQL文件并在Snowflake执行后导出CSV
Python版Glue作业实现:读取S3 SQL文件并在Snowflake执行后导出结果到S3
前置准备
- 确保Glue作业拥有目标S3存储桶的读写权限(
s3:GetObject、s3:PutObject等) - 已配置Snowflake与Glue的连通性,或准备好Snowflake的认证信息(建议通过Glue Secrets Manager存储敏感信息,避免硬编码)
- 在Glue作业的Python依赖中添加
snowflake-connector-python、pandas、boto3(若默认未包含)
核心代码实现
import boto3 import snowflake.connector import pandas as pd from io import StringIO # 配置参数(建议通过Glue作业参数或Secrets Manager传入) S3_BUCKET = "your-bucket-name" SQL_FILE_KEY = "test.Sql" RESULT_S3_KEY = "result/query_result.csv" SNOWFLAKE_CONFIG = { "account": "your-snowflake-account", "user": "your-username", "password": "your-password", "warehouse": "your-warehouse", "database": "your-database", "schema": "your-schema" } def read_sql_from_s3(bucket, key): """从S3读取SQL文件内容""" s3_client = boto3.client('s3') response = s3_client.get_object(Bucket=bucket, Key=key) return response['Body'].read().decode('utf-8').strip() def execute_snowflake_query(sql): """连接Snowflake执行SQL并返回结果DataFrame""" conn = snowflake.connector.connect(**SNOWFLAKE_CONFIG) df = pd.read_sql(sql, conn) conn.close() return df def write_df_to_s3(df, bucket, key): """将DataFrame写入S3指定路径(CSV格式)""" csv_buffer = StringIO() df.to_csv(csv_buffer, index=False) s3_client = boto3.client('s3') s3_client.put_object( Bucket=bucket, Key=key, Body=csv_buffer.getvalue() ) # 主逻辑 if __name__ == "__main__": # 1. 读取S3中的SQL文件 sql_query = read_sql_from_s3(S3_BUCKET, SQL_FILE_KEY) # 2. 在Snowflake执行SQL result_df = execute_snowflake_query(sql_query) # 3. 将结果写入S3的result文件夹 write_df_to_s3(result_df, S3_BUCKET, RESULT_S3_KEY)
关键注意事项
- 敏感信息处理:绝对不要在代码中硬编码Snowflake密码、账号等信息,建议通过Glue作业的「作业参数」传递,或使用AWS Secrets Manager存储并在作业中调用
- SQL文件兼容性:确保
test.Sql中的SQL语句是Snowflake支持的语法,若文件包含多行SQL或注释,需额外处理(比如过滤空行、注释行) - 格式选择:示例中用CSV格式导出结果,若需要其他格式(如Parquet),可修改
write_df_to_s3函数,使用df.to_parquet()替代CSV逻辑 - Glue作业配置:在Glue作业的「Python版本」选择3.x,确保依赖包能正常安装
内容的提问来源于stack exchange,提问作者malcolm richard
相关产品推荐
相关产品推荐

