SuperAPI AI 工具集

streamlit-snowflake

编程与开发

查看项目

更新于 10-15 13:50

技能介绍

用途

本技能用于在 Snowflake 内部原生构建和部署 Streamlit 应用,包括将应用作为 Native App 发布到 Snowflake Marketplace。适用场景包括:构建在 Snowflake 内运行的数据应用、需要 Snowpark 集成进行数据访问、将应用发布到 Snowflake Marketplace、为 Streamlit in Snowflake 搭建 CI/CD。

不适用场景:在 Snowflake 外部托管 Streamlit(应使用 Streamlit Community Cloud);构建通用 Snowpark 流水线(应使用 Snowpark 专用技能);需要自定义 Streamlit 组件(SiS 不支持)。

主要能力与使用方式

快速开始

  1. 初始化项目:将模板复制到项目目录,创建项目文件夹(如 mkdir my-streamlit-app && cd my-streamlit-app),模板由 Claude 提供。
  2. 配置 snowflake.yml:需填写标识符、stage、仓库等占位符,示例结构包含 definition_version: 2、entities 下的 type 为 streamlit、identifier、stage、query_warehouse、main_file、pages_dir 以及 artifacts(如 common/、environment.yml)。
  3. 部署:使用 snow streamlit deploy --replace,或加 --open 在浏览器中打开。

运行时环境

Snowflake 为 Streamlit 应用提供两种运行时:

  • 仓库运行时(默认):为每位查看者创建个人实例;使用 environment.yml 与 Snowflake Anaconda Channel;支持 Python 3.9、3.10、3.11;Streamlit 1.22.0 - 1.35.0;适合零散使用、隔离会话。
  • 容器运行时(预览):为所有查看者创建共享实例;使用 requirements.txt 或 pyproject.toml 配 PyPI 包;仅支持 Python 3.11;Streamlit 1.49+;成本显著更低(约 $2.88/天 vs 等效计算约 $48/天);适合频繁使用、成本优化。

容器运行时配置通过 CREATE STREAMLIT 语句设置 RUNTIME_NAME = 'SYSTEM$ST_CONTAINER_RUNTIME_PY3_11'、COMPUTE_POOL 和 QUERY_WAREHOUSE。关键区别:容器运行时允许外部 PyPI 包,不再局限于 Snowflake Anaconda Channel。

安全模型

  • 所有者权限(默认):应用以所有者权限而非查看者权限执行,使用所有者配置的仓库,查看者可利用所有者角色权限访问任何数据。适用于内部工具和受信任用户。
  • 调用者权限(v1.53.0+):应用以查看者权限执行,每位查看者仅能看到其有权限访问的数据,适用于公开或外部面向的应用、按用户的数据访问控制、多租户数据隔离。

关键模式

  • Snowpark 会话连接:通过 st.connection("snowflake") 获取会话,再执行 SQL 并转为 pandas DataFrame 展示。
  • 调用者权限连接:使用 st.connection("snowflake", type="callers_rights") 实现数据隔离。
  • 缓存昂贵查询:使用 @st.cache_data(ttl=600);注意在 v1.22.0-1.53.0 中 params 参数不参与缓存键,参数化查询应使用 ttl=0 禁用缓存或升级到 1.54.0+。
  • 优化 Snowpark DataFrame 性能:仅选择所需列,因为图表和表格组件会调用 to_pandas() 评估所有列,预选列可减少数据传输,宽表可提升 5-10 倍。

项目结构与环境配置

标准项目结构包含 snowflake.yml(必需)、environment.yml(必需)、streamlit_app.py 主入口、pages/ 多页面目录、common/ 共享工具、.gitignore。environment.yml 必须使用 channels: - snowflake,并显式指定 streamlit=1.35.0(默认版本为较旧的 1.22.0)。

部署命令

  • 基本部署:snow streamlit deploy --replace,加 --open 可在浏览器打开,多实体时可指定实体名。
  • CI/CD:参见 references/ci-cd.md 的 GitHub Actions 工作流模板。
  • Marketplace 发布(Native App):转换为 Native App(使用 templates-native-app/ 模板)、创建 Provider Profile、提交审批。

包可用性

仅 Snowflake Anaconda Channel 中的包可用,可通过 information_schema.packages 查询。常见可用包包括 pandas、numpy、scipy、plotly、altair (4.0)、matplotlib、scikit-learn、xgboost、snowflake-snowpark-python、streamlit 等。不可用:conda-forge 包、自定义/私有包、需要原生编译的包。

错误预防要点

本技能预防 14 类已记录的错误,包括:使用非 snowflake 渠道导致 PackageNotFoundError;默认 Streamlit 版本过旧;ROOT_LOCATION 已弃用;2026 年起仅密码认证失败;文件上传超过 200MB;数据显示超过 32MB;page_title 等不支持;自定义组件错误;_snowflake 模块迁移;缓存参数键问题;连接名与 secrets.toml 配置;Native App 版本意外升级;容器运行时子目录路径问题;宽表性能慢。

已知限制

  • 数据与大小:后端/前端消息上限 32MB,文件上传上限 200MB,不支持 .so 文件,仅支持内部 stage。
  • UI 限制:st.set_page_config 的 page_title、page_icon、menu_items 不支持;st.bokeh_chart 不支持;自定义组件仅限无外部服务调用者;CSP 阻止外部脚本、样式、字体、iframe;eval() 被阻止。
  • 缓存(仓库运行时):仅会话级,不跨用户持久;容器运行时支持跨查看者完整缓存。
  • 包限制(仓库运行时):仅 Snowflake Anaconda Channel,无 conda-forge、无 pip;容器运行时允许 PyPI 包。
  • 网络与访问:无 Azure Private Link / GCP Private Service Connect;Streamlit 对象不支持复制。
  • 认证:仅密码认证正在弃用,Milestone 1(2025年9月-2026年1月)Snowsight 用户需 MFA;Milestone 2(2026年5-7月)所有新用户必须使用 MFA;Milestone 3(2026年8-10月)所有用户必须使用 MFA 或密钥对/OAuth。推荐方式:密钥对认证、OAuth 客户端凭据、工作负载身份联合。

限制与未提供信息

关于具体收费价格,除容器运行时成本对比数据外,其余定价信息暂未提供。完整 Marketplace 审批细节、Provider Profile 具体要求等以官方文档为准。