如何在Snowpark Python环境中添加使用未预装的Python包
如何在Snowpark Python环境中使用非预装的imblearn包
Snowflake官方Anaconda预装通道没有内置imbalanced-learn(即你需要导入的imblearn包),可以根据你的使用场景选择以下三种可行方案,按生产推荐优先级排序:
方案1:手动上传wheel包到内部stage(最稳定,生产环境首选)
这是目前Snowpark使用非预装第三方包的通用标准方案,步骤如下:
- 提前确认你当前Snowpark环境使用的Python版本(Snowpark目前支持3.8/3.9/3.10三个版本,和你创建Session时指定的版本保持一致),下载对应Python版本、
manylinux_x86_64/通用纯Python架构的imblearn安装包,同时检查imblearn的依赖项(包括scikit-learn、scipy、joblib、threadpoolctl等),如果Snowflake预装的依赖版本不满足imblearn的版本要求,需要把对应依赖的wheel包一并下载。注意不要下载Windows、macOS平台编译的二进制包,否则Snowflake运行时会加载失败。 - 将所有准备好的wheel包上传到你有访问权限的Snowflake内部stage,可以选择用户stage、表stage或者专门创建的命名stage(推荐团队场景下建专门的公共stage存自定义依赖),上传可以用SnowSQL命令,也可以直接用Snowpark Python的API完成,示例代码:
# 已完成Session初始化的前提下,上传本地wheel包到stage session.file.put( local_file_name="./imbalanced_learn-0.12.3-py3-none-any.whl", stage_location="@custom_pkg_stage/pkgs", overwrite=True ) # 所有缺失的依赖包都按相同方式上传
- 在编写需要用到imblearn的UDF、UDTF、存储过程时,在
imports参数中指定你上传到stage的所有wheel包路径,packages参数正常声明Snowflake预装的基础依赖即可,示例:
from snowflake.snowpark import functions as F @F.udf( name="smote_resample_udf", replace=True, packages=["snowflake-snowpark-python", "scikit-learn>=1.2.0"], imports=["@custom_pkg_stage/pkgs/imbalanced_learn-0.12.3-py3-none-any.whl"] ) def resample_calc(input_val: list) -> list: # 这里可以正常导入imblearn模块 from imblearn.over_sampling import SMOTE # 业务逻辑省略 return input_val
排错提示:如果导入时提示找不到依赖,优先检查对应依赖的wheel是否已经上传、包的Python版本和运行环境是否匹配、平台架构是否为Linux兼容版本。
方案2:配置私有Conda自定义通道(适合团队级依赖管理)
如果你的Snowflake账号已经开启了自定义Conda通道功能(需要账号管理员操作开通),可以在内部搭建符合Snowflake规范的私有Conda源,将imblearn及对应依赖上传到私有通道后,在Session级别配置自定义通道地址,之后就可以像使用官方预装包一样,直接在packages参数中声明imbalanced-learn依赖,不需要手动上传单个wheel包。
这个方案适合团队有大量非预装第三方包使用需求的场景,配置完成后使用体验和官方预装包完全一致,依赖冲突处理也更简单。
方案3:虚拟环境整体打包(适合快速测试场景)
如果只是做快速功能验证,可以在本地创建和Snowpark Python版本一致的虚拟环境,在虚拟环境中用pip安装imblearn和所有需要的依赖,之后用conda-pack或者venv-pack工具把整个虚拟环境打包成tar.gz压缩包,上传到内部stage后在创建UDF/存储过程时作为整体环境导入即可。
这个方式的缺点是打包后的文件体积大,函数冷启动时间长,不适合生产环境高频调用的场景。
- 注意:不要尝试在UDF/存储过程的运行代码中写
pip install imblearn这类动态安装命令,Snowflake计算节点默认没有公网访问权限,且运行时环境做了权限限制,动态安装的方式100%会执行失败。 - imblearn本身是纯Python实现的包,没有底层C扩展,只要依赖版本匹配,手动上传wheel的方案兼容性非常好,不需要额外做源码编译。
内容的提问来源于stack exchange,提问作者Emre Becit
相关产品推荐
相关产品推荐

