使用外部表增强 Snowflake
作为 Snowflake 用户,您可能熟悉它在协作环境中管理数据方面的优势。Snowflake 的用户体验经常因其直观的界面和无缝集成功能而受到称赞。Snowflake 能够处理各种数据工作负载,从简单的查询到复杂的数据处理任务,使其成为许多数据专业人员不可或缺的工具。然而,由于监管、物流或经济原因,Snowflake的数据在历史上一直存在差距。
Frank Slootman 在 Snowflake 的 23 财年第二季度收益报告中强调,Snowflake 的下一个创新前沿旨在改变云应用程序的构建、部署、销售和交易方式,进一步强调了公司的战略支点,即连接到存储和创建数据的任何地方。检查这些原则是云运营模型的基础;它不将云视为物理位置,而是将其视为设计原则,并且在反思困扰许多 Snowflake 用户的数据差距方面有很长的路要走。23 财年第一季度报告也反映了这一重点,在支持需要数据访问的每种工作负载类型方面进行了大量投资。
除了这些趋势之外,最近的收益报告表明,由于对具有人工智能功能的数据产品的需求不断增长,Snowflake正在将其重点从存储转移到计算。这种贪婪的需求在Snowflake的产品收入中显而易见,在24财年第三季度达到6.985亿澳元,同比增长34%。这种增长归因于对人工智能和高级分析的计算能力的需求不断增长,而不是纯粹的存储。
为了解决数据可访问性方面的差距并继续其增长轨迹,Snowflake 一直在外部表上投入大量资金。这些功能允许用户查询和操作存储在 Snowflake 外部对象存储中的数据。这种战略方法使 Snowflake 能够将存储责任委托给专业提供商,同时专注于增强其计算能力,这对 AI 和高级分析至关重要。
将外部数据源集成到 Snowflake 的平台中特别强大。通过支持外部表,Snowflake 确保用户可以访问和分析数据,无论数据存储在何处。这不仅弥合了数据可访问性方面的历史差距,而且还利用了对象存储解决方案的优势;就 MinIO 而言,这包括性能、可用性和可扩展性。请继续阅读,了解有关在 Snowflake 环境中实现此架构的更多详细信息。
简单易用
与 Snowflake 中的大多数功能一样,连接到存储在 MinIO 上的数据相对简单。查询存储在 MinIO 存储桶中的数据可以像Select * from Bucket1。

设置 Snowflake
同样重要的是要注意,虽然外部表的基本功能在各种版本的 Snowflake 中都可用,但某些高级功能(例如外部表上的具体化视图)需要 Enterprise Edition。
您很可能需要联系您的 Snowflake 代表,将您的 MinIO 终端节点列入白名单。对于此请求,您需要收集帐户标识符、Snowflake 云和 Snowflake 区域。
设置 MinIO
MinIO 是一种对象存储解决方案,提供与 Amazon Web Services S3 兼容的 API,支持所有核心 S3 功能。MinIO 旨在将云视为一种运营模式而不是物理位置,可以部署在各种环境中,包括公共云和私有云、裸机基础设施、编排环境和边缘位置。
只需对 MinIO 设置提出一些要求即可使其与 Snowflake 配合使用。
1 . 必须将 MinIO 设置为允许 DNS 样式访问,并且存储桶必须公开可用。例如,如果您的 MinIO 服务器位于 https://play.min.io,并且存储桶名为 snowflake,则该存储桶应可在 https://snowflake.play.min.io 访问。
2 . 目前,区域必须设置为 NULL 或与 Snowflake 实例的区域相同(例如 us-west-2 )。您将收到来自 Snowflake 查询的错误消息,以便您知道它需要哪个区域。
在下面的示例中,存储桶 snowflake 中有 4 个对象,文件夹/子前缀 sn1 中有另一个对象。Snowflake 将获取所有这些对象。
示例文件可在 https://docs.snowflake.com/en/user-guide/getting-started-tutorial-prerequisites.html#sample-data-files-for-loading 上获得
开始
创建外部表的第一步是创建外部阶段。Snowflake 中的外部阶段用于引用存储文件的外部数据位置(如对象存储)。它充当指向该数据位置的指针。它们主要用于数据加载和卸载操作,并促进批量数据操作的暂存文件过程以及支持外部表。
过去,外部舞台都在Snowflake内部。这通常会导致重复的数据,此体系结构允许在对象存储、Snowflake 中的阶段和 Snowflake 表中使用相同的数据。但是,企业可以直接将 MinIO 等高性能对象存储设置为外部阶段。
这将执行以下操作
- 简化数据流到 Snowflake 中
- 允许更快地提供数据进行分析,以满足业务需求
- 确保没有不必要的数据副本,这有助于治理和成本。

下面是一个示例 SQL 命令,您可以在 Snowflake 控制台中执行以设置 MinIO 外部阶段。将 替换 url 为您自己的存储桶和 endpoint 您自己的终端节点。
create or replace stage minio_excompstage
url='s3compat://snowflake/'
endpoint='play.min.io'
credentials=(
AWS_KEY_ID='********'
AWS_SECRET_KEY='********'
);
用于外部表的 MinIO
Snowflake 中的查询可以直接在外部表上执行,让企业无需数据迁移即可访问 MinIO 桶中的数据。此体系结构使用户能够在其 Snowflake 环境中对 MinIO 中的数据进行只读访问,并避免与将数据移动到 Snowflake 相关的成本和延迟。外部表的功能与 Snowflake 中的任何其他只读表类似,可用于 JOIN、SELECT 查询,并包含在具体化视图中。

初始查询所花费的时间将取决于要传输的数据量,但读取是缓存的,并且后续查询可能会更快,直到下一次刷新。
这种方法的好处是巨大的:
| 方面 | 外部表 | 将传统数据引入 Snowflake |
|---|---|---|
| 设置时间 | 快速配置,无需大量数据迁移立即访问外部数据源 | 需要大量的数据加载和 ETL 流程数据引入管道的复杂配置 |
| 成本效益 | 无需冗余数据存储 只需为查询期间使用的计算资源付费 | 由于重复数据存储而导致成本增加数据传输和长期存储费用增加管理和维护 ETL 基础设施的额外成本 |
| 实时数据访问 | 实时访问和查询数据,无需移动数据非常适合对实时数据进行临时分析 | 由于批处理,实时数据访问受限引入后数据可用性延迟 |
| 单纯 | 易于设置和管理,管理开销最小简化与各种外部数据源的集成过程 | 需要专用资源来管理 ETL 流程数据治理的管理开销更高 |
下面是在您自己的 Snowflake 中实现外部表的示例 SQL:
create or replace external table ext_minio
with location = @minio_excompstage
file_format = (type = csv)
auto_refresh=false
refresh_on_create=false;
alter external table ext_minio refresh;
现在,您可以查询外部表并将其联接到 Snowflake 中的其他表。
select * from ext_minio;
使用 Snowflake CLI (SnowSQL)
可以使用 Snowflake CLI (SnowSQL) 执行上述用于创建的相同命令。
您可以在此处找到有关如何在您的平台上安装 SnowSQL 的说明:https://docs.snowflake.com/en/user-guide/snowsql-install-config.html
唯一的区别是您必须从命令开始
$ snowsql -a <account_identifier> -u <user_name>
帐户标识符的格式为


总结
如果您是希望添加 Snowflake 功能的 MinIO 客户,或者您是希望将其功能扩展到存储在 Snowflake 外部的数据的 Snowflake 客户,请尝试一下。