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

请求协助开发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:56:14