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

如何通过Snowpark从S3读取Excel文件并加载至Snowflake表?

解决Snowpark读取S3 Excel文件并加载到Snowflake表的问题

问题分析

  • Snowflake外部阶段不原生支持Excel格式,必须通过代码解析后才能加载到表
  • 使用Pandas时出现"模块未找到"错误,核心原因是Snowflake服务器端运行环境默认没有pandas和openpyxl(读取Excel的必需依赖),且依赖包需兼容Snowflake的Linux x86_64运行环境才能正常加载
  • 无需用boto3连接S3,Snowpark可直接通过已配置的外部stage访问S3文件,无需额外SDK连接

解决方案步骤

1. 打包兼容Snowflake的依赖包

Snowflake存储过程运行在Linux x86_64环境,需下载对应平台的依赖包:

# 创建依赖目录
mkdir snowpark_deps
# 下载兼容Linux x86_64的pandas和openpyxl
pip install --platform manylinux2014_x86_64 --only-binary=:all: -t ./snowpark_deps pandas openpyxl
# 打包成zip文件
zip -r snowpark_deps.zip snowpark_deps/

2. 上传依赖包到Snowflake内部stage

先创建用于存放依赖的内部stage(已有内部stage可跳过创建):

CREATE OR REPLACE STAGE snowpark_deps_stage;

将本地打包好的snowpark_deps.zip上传到stage:

PUT file://./snowpark_deps.zip @snowpark_deps_stage AUTO_COMPRESS=FALSE;

3. 修正Snowpark代码并创建存储过程

需要先将stage上的Excel文件下载到Snowpark运行环境的临时目录,再用Pandas读取,最后写入Snowflake表:

import snowflake.snowpark as snowpark
import pandas as pd
import os
import tempfile

def main(session: snowpark.Session): 
    # 外部stage中的Excel文件路径
    stage_excel_path = "@your_external_stage/src/excel/emp.xlsx"
    # 创建临时目录存放下载的Excel文件
    with tempfile.TemporaryDirectory() as temp_dir:
        # 从stage下载文件到临时目录
        session.file.get(stage_excel_path, temp_dir)
        # 拼接本地临时文件路径
        local_excel_path = os.path.join(temp_dir, "emp.xlsx")
        # 读取Excel文件
        df = pd.read_excel(local_excel_path)
        # 将Pandas DataFrame转换为Snowpark DataFrame
        snow_df = session.create_dataframe(df)
        # 写入Snowflake表(mode可选overwrite/append,表不存在会自动创建)
        snow_df.write.save_as_table("EMP_EXCEL_TABLE", mode="overwrite")
    return "Excel文件已成功加载到EMP_EXCEL_TABLE表"

创建存储过程时指定依赖包:

CREATE OR REPLACE PROCEDURE load_excel_to_snowflake()
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.8
PACKAGES = ('snowflake-snowpark-python')
IMPORTS = ('@snowpark_deps_stage/snowpark_deps.zip')
HANDLER = 'main'

关键说明

  • session.file.get():Snowpark内置的文件操作API,可直接从外部/内部stage下载文件到运行环境临时空间,无需额外配置S3权限
  • 若Excel包含多个工作表,可在pd.read_excel中添加sheet_name参数指定读取目标sheet
  • 依赖包必须为Linux x86_64版本,否则会出现模块导入失败或兼容性错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:22:14