恭喜你决定开始使用 Snowflake! 本章将带你掌握这个强大的云数据平台的基础要点。内容涵盖:规划你的 Snowflake 环境、创建 Snowflake 账户、浏览其基于 Web 的用户界面。你将学习如何在 Snowflake 中创建数据库与虚拟仓库(virtual warehouse)。本章还会介绍数据加载技巧,包括使用 VARIANT 数据类型与基础 SQL 查询。读完本章,你就可以启程你的云分析之旅,并为后续章节中更高级的 Snowflake 能力做好准备。
引言(Introduction)
在当今数据驱动的世界里,组织需要稳健且可扩展的方案来高效管理与分析数据。Snowflake 作为领先的云数据平台,采用存储与计算分离的独特架构,使企业能够无缝扩展数据仓库需求。本章将提供一份全面指南,帮助你上手 Snowflake,主要包括以下主题:
- 创建 Snowflake 账户:带你完成免费试用账户的开通流程,并指导你选择合适的 Snowflake 版本、云服务商与区域(region) 。
- 浏览 Snowflake 用户界面:熟悉直观的 Web 界面。我们将讲解其关键组件,包括用于运行查询的 Worksheets(工作表) 、用于存放数据的 Databases(数据库) ,以及提供算力的 Warehouses(虚拟仓库) 。
- 创建数据库与仓库:学习如何创建第一个用于存储数据的数据库,以及用于处理查询的虚拟仓库,并提供清晰的 SQL 示例,助你快速起步。
- 向 Snowflake 加载数据:了解如何从多种来源把数据加载进 Snowflake。内容包括支持的文件格式、作为临时存储区的 Stage 用法,以及关键的 PUT 与 COPY INTO 命令;此外,还将学习如何利用通用的 VARIANT 数据类型来处理 JSON 等半结构化数据。
现在开始吧!(Let’s get started!)
创建 Snowflake 账户(Creating a Snowflake Account)
在创建账户前,规划你的 Snowflake 环境至关重要。本节将引导你完成设置账户的关键考量与步骤。作为前置,我们先了解以下内容:
- Snowflake 版本(Editions)
- 云服务商与区域(Cloud providers & regions)
- Snowflake 计费模型(Pricing model)
- Snowflake 工具类型(Types of tools)
Snowflake 版本(Snowflake Editions)
Snowflake 提供多个版本,以满足不同需求与预算。表 2-1 为各版本的简要概览;请以官网的最新信息为准。
表 2-1 Snowflake 版本
| 版本 | 关键特性与适用场景 |
|---|---|
| Standard | 适合中小型企业,数据需求适中 |
| Enterprise | 面向更高性能需求的大型组织 |
| Business Critical | 面向敏感数据,提供更强的安全与合规特性 |
| Virtual Private Snowflake (VPS) | 提供专属的 Snowflake 环境,最大化隔离与控制 |
云服务商与区域(Cloud Providers and Regions)
Snowflake 可运行在主流云上:AWS、Microsoft Azure 与 Google Cloud Platform (GCP) 。每个云厂商在全球设有多个数据中心位置,称为区域(region) 。跨区域传输数据可能产生成本,因此在选区时需结合你的需求评估费用差异。
为满足全球访问速度与数据复制需求,你可能需要多个区域。例如,用户分布在世界各地时,把数据复制或分区到更靠近用户的位置可能更合理。若需要使用多个区域,则必须为每个区域分别创建一个 Snowflake 账户。
注:一个 Snowflake 账户不支持多个区域;你需要为每个区域单独创建账户。
区域只决定数据存放与计算资源的地理位置与供给地,并不限制数据的使用地——你可以在全球任意地点使用这些数据。
此外,每个 Snowflake 账户所选的云平台与其他账户彼此独立。你可以组合不同的云厂商与区域,但需注意这会影响数据导入/导出时的传输成本。不同云或区域也可能存在可用性限制。请参考官方最新信息:docs.snowflake.com/en/user-gui…。
Snowflake 计费模型(Snowflake Pricing Model)
Snowflake 采用按使用量计费的 Credit 模式,即只为实际使用的资源付费。Credit 与三大核心组件相关:存储、计算与数据传输。
-
存储(Storage) :Snowflake 的存储计费考虑压缩,即只按压缩后的数据体量计费;与按未压缩体量计费的方案相比,通常更省。
-
计算(Compute) :计算成本由你用于执行查询/加载数据的虚拟仓库大小决定。虚拟仓库本质是可弹性伸缩的计算资源集群。仓库越大,算力越强,但Credit 消耗也越快。Snowflake 提供 8 种仓库规格,各自有不同的 Credit 消耗速率。
- 例如:选择 Large 规格,其费率为 8 credits/小时。若某任务运行 30 分钟(0.5 小时) ,则计费为 4 credits(8 × 0.5) 。
-
数据传输(Data transfer) :从 Amazon S3、Azure 等外部 Stage 把数据加载进 Snowflake 不收取 Snowflake 侧费用,但若数据与 Snowflake 账户不在同一区域或网络,可能产生云存储提供商的出口(egress)费用。将数据导出到外部存储也会计费,包含导出查询的计算成本以及跨区域/云的出口费(如适用)。
创建账户(Creating an Account)
Snowflake 提供 30 天免费试用,并附带一定额度的 Credits 供你探索功能。开始使用:访问 www.snowflake.com**,点击 Start for Free。按提示填写姓名、公司名、邮箱、电话,以及期望的 Snowflake 版本、云服务商与区域**。提交后,你会收到一封激活邮件。务必在 72 小时内完成激活,否则需要重新创建试用账户。
在开通过程中,你将收到一封“账户已配置完成”的邮件,其中包含 Snowflake Web 界面链接与账户激活链接。点击 Activate 后,浏览器会提示你创建用户名与密码。设置完成后,将看到 “Welcome to Snowflake” 的 Web 界面——恭喜,你已正式登录 Snowflake!
完成账户激活后,你即可访问 Snowflake Web 界面;下一节我们将继续探索其主要功能与操作。
使用 Snowsight 导航 Snowflake(Navigating Snowflake with Snowsight)
现在你已创建好 Snowflake 账户,可以通过其用户界面(UI)来设置环境。你的账户可能能访问两种 UI:Classic Console 与 Snowsight。两者功能等同。Snowflake 正在分阶段将所有账户升级到 Snowsight,最终仅保留 Snowsight 访问;因此本节重点介绍 Snowsight。
Snowsight 就像一个用于管理数据仓库环境的可视化控制面板。它由四个关键区域组成:导航菜单、搜索、快捷操作、以及最近查看(见图 2-1)。
- Navigation(导航) :在 Snowsight 中访问与管理各组件的中枢。你可以用它来创建与管理数据产品、notebooks(笔记本) 、worksheets(工作表) 、**databases(数据库)**以及其他相关工件。
- Search bar(搜索栏) :帮助你在 Snowflake 环境中快速定位特定内容。可搜索导航菜单项与数据库对象,如表、列、函数等。
- Quick actions(快捷操作) :提供与你当前角色相匹配的常用操作快捷入口。例如:在工作表中查询数据、将文件上传到表、以及用于 Python 代码的工作表等。
- Recently viewed(最近查看) :记录你的最近活动,便于导航与回溯。你也可以在此创建不同类型的内容。
在 Snowflake 中创建数据库与仓库(Creating a Database and Warehouse in Snowflake)
数据库与仓库是 Snowflake 架构中的基础组件,分别在数据存储与数据处理中扮演关键角色。理解这两个概念有助于更高效地使用平台。数据库(database)是用来以结构化方式存放相关数据集的逻辑容器;这种逻辑隔离有助于组织数据并实施访问控制——例如,不同部门或不同应用可以使用各自的数据库。仓库(warehouse)提供对数据库中数据进行查询与处理所需的计算资源。仓库与数据库彼此独立,因此可按需灵活扩缩。下面先从创建仓库开始。
创建仓库(Creating a Warehouse)
我们来看两种创建仓库的方式:通过 Snowflake Web 界面,以及使用 SQL 命令。
CREATE WAREHOUSE:Web 界面
- 登录你的 Snowflake Web 界面。
- 点击 Admin → Warehouses。
- 点击右上角 + Warehouse。
- 为仓库填写名称与描述(见图 2-2)。
a. 选择 Type 与 Size。本次演示保持默认值。
b. 根据需要调整 Advanced Options。本次演示保持默认值。
图 2-2 通过 Web 界面创建新仓库
CREATE WAREHOUSE:SQL 命令
以下示例通过 Snowflake UI 中的 Worksheet 执行;你也可以使用已连接到 Snowflake 的 SQL 客户端。
-
点击 Worksheets。
-
在右上角点击 +(Create SQL Worksheet) 。
-
执行下列
CREATE WAREHOUSE命令:CREATE WAREHOUSE JUMPSTART_SNOWFLAKE_SQL WITH WAREHOUSE_TYPE = 'STANDARD' WAREHOUSE_SIZE = 'XSMALL' AUTO_SUSPEND = 600 AUTO_RESUME = TRUE; -
图 2-3 显示名为 JUMPSTART_SNOWFLAKE_SQL 的仓库已成功创建。
图 2-3 在 Worksheet 中执行 CREATE WAREHOUSE 语句以创建仓库
注意(Caution)
务必确保在仓库上启用 auto suspend 与 auto resume。默认情况下,虚拟仓库在开通时会为你设置好这些选项。auto suspend 会在仓库空闲达到设定时长后自动停止;auto resume 会在有查询提交时自动启动已挂起的虚拟仓库。这一点很重要:运行中的仓库仅在计算资源被使用时才会消耗 Snowflake credits。在不使用时关闭仓库有助于节能并控制成本。
创建数据库(Create a Database)
现在你已经创建了仓库,接下来创建一个数据库!与仓库类似,你可以通过 Web 界面或 SQL 命令创建数据库。创建时可以指定若干关键参数:
- Database name:在 Snowflake 账户内唯一标识该数据库。
- Database owner:对该数据库拥有全部权限。
- 其他相关属性:如安全、复制等参数,视具体需求而定。
CREATE DATABASE:Web 界面
- 点击 Data → Databases。
- 点击右上角 + Database。
- 为数据库填写 Name 与 Comment(描述) (见图 2-4)。
图 2-4 通过 Web 界面创建新数据库
- 点击 Create。
- 数据库创建后,可点击省略号(…)以编辑权限、新增 schema、克隆(clone) 、删除(drop)或转移所有权(transfer ownership) (见图 2-5)。
图 2-5 通过省略号为所选数据库执行各类操作
CREATE DATABASE:SQL 命令
若要用 SQL 创建同名数据库,请在已连接到 Snowflake 的 SQL 客户端中执行下列语句;你也可以在 Snowsight 的 Worksheet 中执行:
create DATABASE IDENTIFIER('"EXAMPLE_DATABASE"')
COMMENT = 'Jumpstart Snowflake - creating a new database example'
将数据加载到 Snowflake(Loading Data into Snowflake)
现在你已经在 Snowflake 中设置好了数据库与仓库,下一步就是加载数据。Snowflake 针对这一过程做了优化,支持多种加载方式、来源与格式。在数据量较小或进行初始测试时,你可以直接从本地文件将数据加载到 Snowflake。随着数据需求增长,借助 Snowflake 与 Amazon S3、Azure Blob Storage、Google Cloud Storage 等云存储服务的集成会更具优势。直接从这些平台加载既适合大数据集,也能帮助你构建稳健高效的数据管道,简化摄取流程,并将你的数据工作流与既有云存储解决方案无缝整合。
将数据加载到 Snowflake 有两种方式:使用 COPY 语句进行批量加载,以及使用 Snowpipe 进行持续加载。本章聚焦批量加载,涵盖以下主题:
- 批量加载概览:什么是批量加载、文件加载位置、支持的文件格式与编码、压缩处理、加密选项。
- 批量加载建议:文件准备(含文件大小与拆分)、CSV 与半结构化格式、分区/暂存(staging)、加载与查询。
注:使用 Snowpipe 的持续加载在第 3 章介绍。
批量数据加载概览(Overview of Bulk Data Loading)
使用 COPY 进行批量加载的实践早于 Snowflake 的出现,许多数据库管理系统都支持 COPY 语句,因此 Snowflake 同样提供此能力。为更好地理解批量加载,我们先回答几个关键问题:
- 什么是批量数据加载?
- 可以从哪些位置进行批量加载?
- 有哪些压缩与加密选项?
- 支持哪些文件格式?
要把数据放入数据库表,必须插入(insert) 。逐行插入可能耗时很长;批量复制(bulk copy)可以一次性将大量数据以批次插入表中。Snowflake 的批量加载允许从云存储中的文件(如 AWS S3)批量导入。
如果你的数据文件当前不在云存储中,可以先把本地文件复制到云端的暂存区域(stage) ,再加载到 Snowflake。这就是 Snowflake 的内部暂存区:文件从本地传输到 Snowflake 指定的内部云存储位置,然后通过 COPY 命令加载至表。
无论你的 Snowflake 账户运行在哪家云平台,Snowflake 均支持从以下暂存位置加载:
- Snowflake 指定的内部存储暂存位置
- AWS S3:可直接从任意用户自有的 S3 bucket 加载
- GCP Cloud Storage:可直接从任意用户自有的 GCS 容器加载
- Azure Blob Storage:可直接从任意用户自有的 Azure 容器加载
注:当跨不同平台进行暂存与加载时,可能产生数据传输计费。
压缩处理(Compression Handling)
当在 Snowflake 的 stage 中暂存未压缩文件时,系统会自动使用 gzip 进行压缩,除非你显式禁用。Snowflake 能自动识别 gzip、bzip2、deflate、raw_deflate。对 brotli 与 zstandard(zstd) 目前不支持自动识别;如果使用这两种压缩,请在暂存或加载时显式指定压缩方式。
加密选项(Encryption Options)
当在 内部 Snowflake 位置暂存未加密文件时,系统会自动使用 128 位密钥加密。你也可以启用 256 位密钥(更强加密),但需额外配置。若文件已加密且位于外部云存储,可照常加载;但必须向 Snowflake 提供用于加密这些文件的密钥。
支持的文件格式与编码(Supported File Formats and Encoding)
Snowflake 支持多数常见的数据加载文件格式,包括:
- 定界文本文件(支持任意有效定界符;默认逗号)
- JSON、XML
- Avro(自动识别与处理使用 Snappy 压缩的暂存 Avro 文件)
- ORC(自动识别与处理使用 Snappy/zlib 压缩的暂存 ORC 文件)
- Parquet(自动识别与处理使用 Snappy 压缩的暂存 Parquet 文件)
对定界文本文件,默认字符集为 UTF-8;若需其他字符集,必须显式指定编码。对 JSON、Avro 等其他受支持格式,唯一支持的字符集是 UTF-8。
批量数据加载建议(Bulk Data Loading Recommendations)
加载大数据集会影响查询性能。Snowflake 建议将加载与查询分别投入不同的仓库,以优化各自性能。本节介绍文件准备的推荐做法。
文件准备与大小(File Preparation and Sizing)
可并行处理的文件数由仓库中服务器的数量与能力决定。遵循以下文件尺寸指南,可使数据加载占用最少资源(适用于批量加载与 Snowpipe 持续加载):
-
并行执行的加载操作数不超过待加载的数据文件数。
-
为优化并行度,建议生成**约 100MB–250MB(压缩后)**的数据文件。
-
合并过小文件,以减少单文件处理开销。
-
拆分超大文件为更多小文件,以把负载分散到活跃仓库中的多台服务器;并行处理的文件数由仓库服务器的数量与能力决定。
-
建议按行拆分大文件,避免记录跨越数据块。
-
加载超大 Parquet 文件(如 >3GB)可能超时;请拆分为 ≤1GB 的文件。
-
若源数据库无法按小块导出,可用第三方工具拆分大 CSV:
- Windows 无内置分割工具,但有大量第三方工具/脚本可用;
- Linux 可使用
split将 CSV 拆分为多个小文件。
注:拆分大文件可使加载线性扩展。仅仅增大仓库规格(XL、2XL 等)会消耗更多 credits,未必带来性能提升。
CSV 文件准备(CSV File Preparation)
准备定界文本(CSV)文件时请注意:
-
默认字符集为 UTF-8;也支持其他编码,可使用文件格式选项
ENCODING指定。 -
Snowflake 支持 ASCII 字符(含高位字符)作为定界符。常见字段定界符有:竖线
|、逗号,、插入符号^、波浪线~。 -
字段可可选使用双引号包围;在被引号包围的字段内,所有特殊字符会自动转义,但双引号本身需用两个双引号紧挨着来转义:
""。- 对未被引号包围的字段,默认转义字符为反斜杠 ``。
-
可使用常见转义序列:
\t(制表符)、\n(换行)、\r(回车)、\(反斜杠)。 -
含有回车符的字段应加引号(单引号或双引号)。
-
各行列数应一致。
半结构化数据准备与 VARIANT 值(Semi-Structured Data File Preparation and VARIANT values)
半结构化数据不符合传统结构化数据的标准,但包含标签或标记以标识数据中的独立实体。其与结构化数据的两个关键差异:
- 嵌套数据结构
- 缺少固定模式(schema)
结构化数据要求在加载/查询前预定义固定 schema;半结构化数据则无需预先定义,可持续演进(随时新增属性)。同一类实体内部也可能具有不同属性集合,属性顺序不重要。与平铺表格的结构化数据不同,半结构化数据可包含 n 层嵌套层级。
半结构化数据的加载步骤与结构化数据相同:Snowflake 将半结构化数据加载到表中的单个 VARIANT 列。在数据转换时,也可使用 COPY INTO <table> 从暂存文件中抽取选定字段,映射到表的独立列。
当把半结构化数据插入 VARIANT 列时,Snowflake 实际会提取键位置与数值等信息,保存为一个半结构化文档;其元数据由引擎索引,以支持快速 SQL 检索。
注:
VARIANT中的 “null” (不同于 SQL 的NULL)不会被加载到表中。为避免丢失,可在加载前将包含"null"的元素抽取到关系型列;或者,若"null"仅表示缺失值且无其他含义,建议在加载半结构化文件时将文件格式选项STRIP_NULL_VALUES=TRUE。
文件暂存(File Staging)
Snowflake 的内部与外部 stage 都可包含路径(在 AWS 中称为 prefix)。对常规数据集,建议按逻辑路径进行分区,例如包含地理位置与数据写入日期等信息。
通过路径组织数据文件,可用单条命令完成复制;也可并发执行多条 COPY,每条匹配一部分文件,从而利用并行。
例如,若你的公司在全球开展业务,可在路径中加入洲/国家/城市等标识以及写入日期:
NA/Mexico/Quintana_Roo/Cancun/2024/01/01/01/
在规划定期加载(如 ETL)时,应在内部 stage(Snowflake)或外部位置(S3、Azure 容器)按逻辑、细粒度路径进行分区。可在分区结构中包含应用/位置与写入日期等信息。这样,你可以通过单条命令按小时/天/月/年将任意分区子集复制到 Snowflake。
S3 分区路径示例:
s3://bucket_name/brand/2024/07/01/11/
s3://bucket_name/region/country/2024/07/01/14/
加载(Loading)
COPY 命令支持多种从 stage 加载文件的方式:
- 按内部位置路径或外部位置前缀
- 列出特定文件进行加载(每条
COPY最多 1000 个文件) - 通过**模式匹配(pattern)**选择特定文件
这些方式都能让你用单条命令复制部分暂存数据到 Snowflake 的表中,并发执行多条 COPY 匹配不同子集,以发挥并行能力。请特别注意:被复制的文件必须与目标表具有相同的数据结构(列数、数据类型等)。
提示:从 stage 显式列出具体文件进行加载通常最快。
练习(Exercises)
Snowflake 提供从本地文件系统与 S3 进行批量加载的教程,详见:
- 本地文件系统:docs.snowflake.com/en/user-gui…
- 外部数据(S3):docs.snowflake.com/en/user-gui…
小结(Summary)
本章带你完成了 Snowflake(这一强大的云数据平台)的入门要点:了解各版本并创建免费试用账户;熟悉可选的云服务商与区域及其选型考量;掌握 Snowflake 的按量计费模型(基于存储、计算与数据传输)以便更好地管控成本。
你还学习了如何创建数据库与虚拟仓库,为数据仓库活动打下基础,并初步了解了在 Snowflake 中的数据加载技术——这是任何数据仓库方案的关键环节。凭借本章获得的知识与技能,你已准备好在后续章节中探索 Snowflake 的更高级能力。