如何在Snowflake Streamlit应用中读取Stage中的Pickle文件?
解决Snowflake Streamlit读取Stage中Pickle模型的问题
问题原因
你当前用的session.add_import是针对Snowpark UDF/存储过程设计的文件导入机制,在Streamlit应用环境里没法可靠把Stage文件加载到应用可访问的本地路径,依赖sys._xoptions获取导入目录的方式也不适合Streamlit场景。
解决方案:用session.file.get直接下载文件
Streamlit运行在Snowflake容器环境中,可通过Snowpark的file.get方法把Stage里的文件下载到应用临时目录,再读取Pickle文件。修改后的代码如下:
import streamlit as st from snowflake.snowpark.context import get_active_session import pandas as pd import os import cachetools # 获取当前会话 session = get_active_session() @cachetools.cached(cache={}) def load_pickle_model(stage_file_path, local_file_name): # 定义本地临时路径(Streamlit允许访问/tmp目录) local_path = os.path.join("/tmp", local_file_name) # 从Stage下载文件到本地临时目录 session.file.get(stage_file_path, local_path) # 读取Pickle模型 with open(local_path, 'rb') as file: model = pd.read_pickle(file) return model # 加载模型,同一库/ schema下可直接用@stage_demo/cox_model.pkl cph = load_pickle_model("@stage_demo/cox_model.pkl", "cox_model.pkl") # 测试打印模型摘要(如果模型支持该方法) st.write(cph.summary())
关键注意事项
- Stage路径准确性:同一数据库和Schema下直接用
@stage_demo/cox_model.pkl即可,跨库需指定完整路径@database_name.schema_name.stage_demo/cox_model.pkl。 - 临时目录权限:Streamlit在Snowflake环境中默认有权访问
/tmp目录,不要用其他自定义目录,避免权限问题。 - 缓存机制:保留
cachetools.cached可避免每次运行重复下载模型,提升应用性能。
验证Stage文件存在性
如果仍无法加载,先执行以下SQL确认Stage中的文件存在:
LIST @stage_demo;
确认输出包含cox_model.pkl且路径正确。
内容的提问来源于stack exchange,提问作者neringab
相关产品推荐
相关产品推荐

