跳至主要内容

Snowflake 与 Streamlit:构建数据应用的完整指南

全面演示如何在 Snowflake 内直接构建、部署和优化 Streamlit 应用。通过其与强大云平台的集成,利用流行的开源 Python 框架。
· 15分钟 阅读

使用 AI 探索

Snowflake 是一款流行而强大的云端数据平台,而 Streamlit 是一个用于构建数据类 Web 应用的开源 Python 框架。Streamlit in Snowflake(SiS)是一种集成方案,可让您在 Snowflake 生态内直接构建和部署数据应用。您无需在多套工具间切换,即可使用 Python 和 Snowflake 的基础设施快速创建交互式应用。

本教程将带您了解 Streamlit in Snowflake 是什么、其关键特性、设置步骤、部署策略、安全与性能优化建议,以及真实场景用例。完成后,您将获得构建并上线首个数据应用的清晰路线图。请先回顾Snowflake 基础及其界面。我也建议您在 Snowflake 之外先用 Python 试一试 Streamlit,以更好地理解其功能,参见这篇 Streamlit 教程。

什么是 Streamlit in Snowflake?

Streamlit in Snowflake 让您无需离开平台,就能构建与 Snowflake 数据直接相连的交互式应用。

Streamlit in Snowflake 概览

Streamlit in Snowflake 将 Streamlit 的简洁易用与 Snowflake 的可扩展性相结合。传统上,构建应用需要外部服务器、API 和复杂集成。Streamlit 将核心功能精炼为少量面向对象的 API 与 Python 集成。随后通过 Snowsight 将部署工作交给 Snowflake 处理。

这消除了额外基础设施的需求,提供与 Snowpark、Cortex AI 以及您的 Snowflake 数据无缝集成的一体化环境。也就是说,Python 开发者与数据团队可在同一来源上工作,无需承担传输数据或代码的额外开销。

历史背景

2022 年,Snowflake 收购了 Streamlit,使交互式应用开发更靠近企业数据。它延续了 Streamlit 的开源愿景,让开发者借助 Python 构建优雅的 Web 应用,并与当前最强大的数据平台之一集成。这使企业能更灵活地使用 Streamlit,减少安全方面的担忧,并统一应用开发。

核心理念

SiS 的理念是在保有您对 Snowflake 一贯预期的安全与治理水平的同时,提供使用 Streamlit 构建数据类 Web 应用的便捷体验。由于所有数据都留在 Snowflake 内部,您可以获得与以往相同的安全与保护保障。

其主要优势在于确保 Python 框架保持一致,并在 Snowflake 上提供与平台外相似的体验。这使得 SiS 对曾使用过 Streamlit 的开发者,或具备 Python 经验、希望利用现有技能为 Snowflake 数据构建 Web 应用的人来说,更加易于上手。

Streamlit in Snowflake 的关键特性与能力

Streamlit in Snowflake 保留了 Snowflake 的关键云特性,如全托管与便捷协作。同时继承了 Streamlit 在可视化与快速迭代上的优势,并与基础设施深度集成。

全托管服务

Snowflake 在幕后管理全部基础设施,这意味着您无需担心服务器、扩展或稳定性。应用具备实时交互能力,会根据使用量自动扩展,并受益于 Snowflake 内置的可靠性。

与 Snowflake 基础设施的集成

Snowflake 内的 Streamlit 应用可原生连接 Snowpark、Cortex AI 和数据库。例如,您可以将 Cortex AI Analyst 集成到 Streamlit 应用中,让用户在仪表盘内以自然语言就数据进行提问并获得回答。

其他 Snowflake 特性,如内置缓存,可减少冗余查询;而深色模式、自定义组件等 UI 增强功能能改善用户体验。认证与安全连接通过 Snowflake 的认证协议自动处理。数据敏感性可借助 Snowflake 的基于角色控制进行管理。

这简化了数据管理的工作,让开发者专注于构建工具。

交互式可视化与快速迭代

Streamlit 的一大优势是在几分钟内将简单的 Python 脚本变成交互式应用。在 Snowflake 中,您可以直接预览并迭代应用,更新代码即可实时看到结果,无需等待冗长的部署流程。

共享与协作

Streamlit 应用可在 Snowflake 内直接与用户共享。这样便于通过角色或个体成员将应用分享给不同团队。协作内嵌于工作流程中,支持多名团队成员共同开发、测试和部署应用。

开始使用 Streamlit in Snowflake

上手 SiS 十分简单,您可在数分钟内创建首个应用。我们只需确认您具备适当的权限与基础知识。

先决条件

要在 Snowflake 中构建 Streamlit 应用,您需要一个可访问 Snowsight(Web 界面)的有效 Snowflake 账户。这门Snowflake 入门课程可带您熟悉 Snowsight 的导航。您应具备 Python 的基础知识。复习一下这门Python 入门课程也不失为明智之举。

获得 Snowflake 访问权限后,请确认您拥有以下权限:

  • 数据库权限:USAGE
  • 架构(Schema)权限:USAGE、CREATE STREAMLIT、CREATE STAGE

账户设置与环境配置

先登录 Snowsight,并选择或创建一个将承载您应用的数据库与架构。前往 My Workspace 并打开一个新的 SQL 文件。我们来创建一个名为 streamlit_creator 的角色,使其能够访问 streamlit_database 上的 streamlit_schema。此外,我们将创建名为 streamlit_wh 的仓库,作为 Streamlit 应用的主要计算资源。

CREATE ROLE streamlit_creator;
CREATE DATABASE streamlit_db;
USE DATABASE streamlit_db;
CREATE SCHEMA streamlit_schema;
CREATE WAREHOUSE streamlit_wh WITH WAREHOUSE_SIZE = ‘XSMALL’;
GRANT USAGE ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_creator;
GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_creator;
GRANT USAGE ON WAREHOUSE streamlit_wh TO ROLE streamlit_creator;
GRANT CREATE STREAMLIT ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_creator;
GRANT CREATE STAGE ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_creator;

构建您的第一个 Streamlit 应用

为更具象化,我们来演示一个简单应用。完成 Snowflake 账户与权限设置后,在 Snowsight 中导航至 PROJECTS >> Streamlit。在该窗口右上角点击 + Streamlit App。

在 App name 中填入任意名称。将应用位置更新为 STREAMLIT_DB 和 STREAMLIT_SCHEMA。然后选择“Run on warehouse”,并将 App Warehouse 设为“STREAMLIT_WH”。

这会打开编辑器,并默认附带一个小示例脚本。应用也会自动运行并显示预览。

我们来向应用中加入一些感兴趣的数据。请将以下代码片段添加到现有代码的底部:

	from snowflake.snowpark.functions import sum as sf_sum
	st.title("Simple Sales Dashboard")
	st.write("This app displays sales by part using Snowflake data.")

	# Query sample dataset
	df = (
	    session.table("SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.LINEITEM")
	    .group_by("L_PARTKEY")
	    .agg(sf_sum("L_QUANTITY").alias("TOTAL_SALES"))
	    .limit(10)
	    .order_by("TOTAL_SALES", ascending=False)
	    .to_pandas()
	)

	# Plot chart
	st.bar_chart(data=df, x="L_PARTKEY", y="TOTAL_SALES")

	# Show table
	st.dataframe(df)

	

然后点击右上角的“Run”按钮。应用预览将更新并处理示例表中的数据。您应能看到数据表和柱状图。从这里开始,您可以自定义查询、添加筛选条件,或用 Streamlit 组件增强界面。

您会注意到这里使用了 Snowpark。若您尚未使用过,Snowpark 是 Snowflake 的库,可让您使用 Python 等编程语言处理 Snowflake 数据。我强烈推荐这篇Snowpark 入门,因为在 Streamlit 中拉取数据通常需要借助 Snowpark 与 Snowflake 数据库交互。

部署策略与方法

在 Snowflake 中部署 Streamlit 有多种方式。最简单的是使用 Web 界面 Snowsight,您也可以使用命令行界面(CLI)工具。此外,还可加入工作流工具以帮助项目组织与部署扩展。

通过 Snowsight 部署

如上节所示,最简单的方法是通过 Snowflake 的 Web 界面 Snowsight。其优势在于可以分屏实时编辑与预览应用。此设置非常适合希望在开发过程中获得即时反馈的开发者。

通过 CLI 部署

在更高级的场景中,CLI 工具可让您以编程方式部署应用。这对将应用部署纳入持续集成与持续交付(CI/CD)流水线尤其有用。采用更结构化的开发方式,应用可像常规 Streamlit 应用一样以 .py 文件存放于项目文件夹中,并配套 .yml 文件来控制环境与 Snowflake 命令。这样我们就可以用 GitHub 追踪变更、运行自动化检查并无缝部署。

与 dbt 和工作流工具集成

另一种选择是将 Streamlit 应用与工作流工具结合,例如 dbt(data build tool,Snowflake 原生支持)。例如,dbt 可管理核心 ETL 工作流,并将结果输送到您的 Streamlit 应用。在同一个 dbt 项目中,您可以按需自动重新部署 Streamlit,以配合 dbt 的工作流。这能将复杂的数据工作流整齐组织到项目中,并让部署随工作流一同扩展。

架构与技术实现

下面来谈谈 Streamlit in Snowflake 的实际运行机制。

技术架构

Streamlit in Snowflake 应用运行在由 Snowflake 全面托管的安全容器化环境中。此设计确保应用保持隔离,同时与 Snowflake 的数据源与服务维持安全连接。随着应用复杂度提升或数据库规模扩大,Snowflake 会在后端负责伸缩。

仓库(Warehouse)管理

当您启动应用时,它将消耗配置仓库的计算资源。与 SQL 查询相同,仓库大小会影响性能与成本,因此资源规划很重要。开发者通常会为 Streamlit 应用绑定一个专用仓库,以便于简化跟踪。此外,Snowflake 使用内部阶段(stage)进行安全的文件存储,防止数据泄露到平台之外。这既简化了向应用馈送数据的过程,又能保障数据安全。

Python 包与环境

SiS 中的 Python 环境由平台统一管理与审查以确保安全。仅可使用经批准的包,并限制安装外部包。此外,出于安全考虑,脚本、样式、字体与 iframe 嵌入等也有所限制。若您需要的功能不在支持范围内,可能需要通过 Snowpark UDF 来实现,或依赖 Snowflake 已支持的现有 Python 库。

安全模型与权限

幸运的是,SiS 复用了 Snowflake 现有的大量安全基础设施,例如基于角色的访问控制、共享与网络安全。

基于角色的访问控制(RBAC)

Snowflake 对 Streamlit 应用及其数据采用基于角色的访问控制(RBAC)。访问数据需要对任意 Streamlit 应用及其底层数据拥有 USAGE 权限。仅具有 CREATE STREAMLIT 权限的角色才能构建应用,而应用的所有权与架构级权限绑定。这确保了对谁能开发和管理应用的清晰控制。

共享与访问控制

应用共享同样受到严格控制。您可以基于用户角色授予或限制对应用的访问。对于 SQL 执行,也遵循相同的基于角色的权限规则。它通过 Streamlit 应用运行 SQL,不允许开发者在没有适当权限的情况下对数据库执行查询。

网络与内容安全

在网络层面,Snowflake 强制实施严格的内容安全策略(CSP)。这可防止应用加载未经授权的外部脚本、样式或资源,降低数据外泄或不安全集成的风险。通过尽量减少导入到环境中的外部库,能降低安全漏洞风险,保护数据与用户隐私。

Snowflake Streamlit 性能优化

随着应用愈加复杂,正确的优化对于维持良好功能性尤为重要。

查询优化与缓存

构建高效应用需要同时关注查询与计算资源。建议在 Streamlit 应用之外(在相同或相似的仓库上)测试您的查询,以评估其计算开销。编写优化的 SQL 查询对避免瓶颈至关重要。

Streamlit 内置的缓存函数 st.cache_data 与 st.cache_resource 有助于减少重复计算与数据重新加载。但需要注意的是,这两者尚未得到完整支持,仅支持基于会话的缓存,这意味着每当用户开启新会话时,查询与数据都需要重新加载。请牢记这一点,并尽可能优化查询。

仓库选择与配置

仓库选择对应用响应性影响重大。更大的仓库能提升速度,但也会增加成本。对于高并发应用,专用仓库可能是最佳选择。而轻量级应用通常可在较小仓库上无性能问题地运行。

应用架构

应用架构同样重要。渐进式数据加载与状态管理能使应用更灵敏,尤其在处理大型数据集时。若应用包含多个组件,尽量避免一次性加载全部内容。只在任一时刻加载用户所需的部分。以资源约束为前提进行应用设计,可避免触及消息大小或内存限制等问题。

Streamlit in Snowflake 的用例与示例应用

除简单的仪表盘与数据应用外,Streamlit in Snowflake 还能借力机器学习、AI、商业智能与 NLP 等强大工具。下面列举一些用例。

商业智能与数据可视化

对分析团队而言,Streamlit in Snowflake 可用于构建交互式仪表盘与报表工具。与 Snowflake 数据库的连接支持仪表盘的实时更新,助力更优决策。您可以快速为不同部门与团队部署相似的应用。例如库存跟踪器、计算资源使用仪表盘或高管绩效摘要。举例来说,我们可借助将 Snowflake Cortex 与 Snowpark 集成到 Streamlit 应用,对呼叫数据的转录进行分析,构建呼叫中心分析。

机器学习与 AI

要充分释放数据价值,可将 Streamlit 应用设计为提供机器学习与 AI 洞见。例如,机器学习团队可部署交互式应用,提供需求预测、客户细分或异常检测模型。借助 Cortex AI,开发者还可以创建 RAG(检索增强生成)应用或对话式 AI 工具。一个很好的实现示例是加入 PyTorch 模型,为客户提供基于个人画像的定向加售,且封装在可视化推理应用中。

NLP 与高级分析

要从聊天、邮件等文本反馈中获得洞见,自然语言处理是不二之选。借助 spaCy、NLTK 或 Snowflake 内部的Cortex AI 文本处理,我们可以对这些文本信息进行情感分析、命名实体识别和其他 NLP 处理。例如,可使用 Snowflake Cortex 处理大部分 NLP 分析,如摘要与情感分析,然后将结果写入数据库,进一步为基于 Streamlit in Snowflake 的评论与客服对话分析提供支持。

数据收集与输入型应用

Streamlit 应用也适用于数据收集与质量管理,例如标注工具或协同输入界面。尽管数据上传限制为 200MB,我们仍可为用户提供上传小型数据集或文档以进行处理或摘要的入口。可能性不胜枚举!

与 Snowflake 生态的集成

将 Streamlit 引入 Snowflake 的强大之处,在于可用到生态内的众多集成,如 Snowpark 与数据共享。

与 Snowpark 的集成

Snowpark 让在 Python 中使用 Snowflake 进行分析变得轻而易举。它支持高级数据处理、分布式计算与自定义函数。由于我们可在 Streamlit in Snowflake 应用中原生使用 Snowpark 数据帧,因而可以几乎零开销地加以利用。在 Snowflake 环境中使用存储过程与 UDF,借助 Snowpark 的 udf 对象将变得非常顺畅。

数据共享与自动化

在 Snowflake 内共享数据很简单,通过 Snowsight 的 UI,只需点击几下即可。结合 Snowflake Tasks 与事件驱动特性,开发者还能轻松实现工作流自动化。例如,当有新数据到达时触发应用更新、执行数据检查以确保稳定,并保持数据新鲜。

结合 dbt,您可以创建端到端工作流,使数据转换结果直接流入 Streamlit 应用,确保为用户提供实时更新。

计费与成本考量

与所有云平台一样,计费与成本考量十分重要。昂贵的 Streamlit 应用更不易被采用,因此提前考虑成本有助于顺利推进开发。

理解 Streamlit in Snowflake 的成本

Streamlit in Snowflake 的成本与 Snowflake 中其他流程相同。若您为 Streamlit 使用了单独的数据库/架构,将产生与该数据相关的常规存储成本。如前所述,您很可能希望为 Streamlit in Snowflake 服务单独创建一个仓库,以便跟踪计算成本。更大的仓库规模、应用并发(多用户会话)以及数据量将是成本的主要驱动因素。

优化资源使用

要控制支出,合理配置仓库规模很关键。轻量级、负载较小的应用应避免使用不必要的大型仓库。Streamlit 的会话内缓存有助于减少重复查询,从而降低计算消耗。Snowflake 也提供了监控工具用于跟踪资源消耗,便于您基于数据进行成本优化。

限制与注意事项

尽管 Streamlit in Snowflake 功能强大,但仍有一些限制需要注意,特别是与外部包和文件上传相关的部分。

内容安全策略(CSP)限制

平台实施严格的内容安全策略以确保数据安全。自定义脚本、样式,以及依赖外部域名的内容更可能被阻止。请确保您使用的任何组件不需要外部调用。这极大提升了应用的安全性,但若您来自自建的 Streamlit 实现,可能会感觉自定义能力受到一定限制。

数据传输与缓存限制

由于缓存与消息传输的一些限制,处理大型数据集可能存在挑战。缓存的关键限制在于基于会话而非基于用户。因此,用户在重新访问应用并开启新会话时需要重新加载数据。请仔细考虑您的用户是否会多次开启新会话;若会,请思考如何在会话之间尽量减少数据加载量。

虽然查询大小或内存中数据量没有明确上限,但消息有 32 MB 的限制。这意味着显示超大型数据帧或极其复杂的地图可能会受限。请权衡哪些内容对用户至关重要,哪些可以加以精简。

文件上传与外部存储限制

文件上传可用,但大小限制为 200MB。您也无法直接使用外部阶段(external stages),需要先将数据移入 Snowflake。因此,不能直接从 Apache Iceberg 拉取数据,但可从内部数据湖拉取相应数据。

此外,文件上传功能受大小限制,且当前不支持外部阶段,这对应用处理文件的方式构成约束。

总结

Streamlit in Snowflake 提供了一种强大而一体化的方式,让您无需离开 Snowflake 环境即可构建和部署交互式数据应用。它兼具安全性、可扩展性与易用性,并支持与 Snowpark、Cortex AI 和 dbt 的高级集成。

尽管存在外部资源与文件上传方面的限制,但快速迭代、托管式基础设施与无缝共享的优势,使 SiS 成为数据团队的变革性平台。初学者可以从小处着手——尝试简单仪表盘——再逐步扩展到企业级的 AI 与分析应用。更多 Snowflake 相关信息,敬请参阅:

Snowflake Streamlit 常见问答

什么是 Snowflake Streamlit?它与常规 Streamlit 有何不同?

Snowflake Streamlit 是在 Snowflake 内原生运行的全托管版 Streamlit,无需单独的服务器或基础设施。常规的 Streamlit 则需要您自行运行/托管。

入门需要多少 Python 知识?

具备基础的 Python 知识即可。如果您会写函数、导入库,并理解数据帧(如 Pandas),就能快速构建简单应用。

通过 Snowsight 与通过 CLI 部署有何主要区别?

Snowsight 可视化且对初学者友好,适合原型开发;CLI 更适用于自动化、版本控制与 CI/CD 流水线。

在 Snowflake 中运行 Streamlit 应用会影响我的积分消耗吗?

会。由于 Streamlit 应用会从 Snowflake 查询数据,运行它们会消耗计算积分,与运行查询类似。优化查询有助于控制成本。

能否将 Snowflake Streamlit 应用与 GitHub 或 CI/CD 集成?

可以。使用 Snowflake CLI,您可以将应用部署集成到 CI/CD 流水线(如 GitHub Actions),在代码变更时轻松实现自动更新。

Tim Lu

作者

Tim Lu

我是一名数据科学家,擅长空间分析、机器学习和数据管道。曾使用过 GCP、Hadoop、Hive、Snowflake、Airflow 等数据科学/工程相关流程与工具。

主题