20 分钟学会使用 Snowflake¶
简介¶
本教程使用 Snowflake 命令行客户端 SnowSQL 来介绍关键概念和任务,包括:
创建 Snowflake 对象 – 创建一个数据库和一个表,用于存储数据。
加载数据 – 我们提供小型的示例 CSV 数据文件供您加载到表中。
查询 – 探索示例查询。
备注
Snowflake 对本教程中示例数据使用的磁盘存储收取最低费用。本教程提供删除数据库并最大程度地降低存储成本的步骤。
Snowflake 需要一个 虚拟仓库 加载数据并执行查询。正在运行的虚拟仓库会使用 Snowflake Credit。在本教程中,您将使用 30 天试用账户 (https://signup.snowflake.com/),该账户提供免费 Credit,您无需支付任何费用。
您将学习的内容¶
在本教程中,您将学习如何进行以下操作:
创建 Snowflake 对象 – 创建一个数据库和一个表,用于存储数据。
安装 SnowSQL – 安装并使用 Snowflake 命令行查询工具 SnowSQL。
Visual Studio Code 的用户可能会考虑使用 Snowflake Extension for Visual Studio Code 而不是 SnowSQL。
加载 CSV 数据文件 – 使用各种机制将 CSV 文件的数据加载到表中。
编写和执行示例查询 – 针对新加载的数据编写和执行各种查询。
先决条件¶
本教程需要数据库、表和虚拟仓库来加载和查询数据。创建这些 Snowflake 对象需要 Snowflake 用户的角色具有必要的访问控制权限。此外,在本教程中,SnowSQL 需要执行 SQL 语句。最后,本教程需要使用包含可加载示例数据的 CSV 文件。
您可以使用现有的 Snowflake 仓库、数据库和表以及您自己的本地数据文件来完成本教程,但我们建议使用 Snowflake 对象和提供的数据集。
要为本教程设置 Snowflake,请先完成以下操作,然后继续:
创建用户
要创建数据库、表和虚拟仓库,您必须以 Snowflake 用户身份登录,并具有授予您创建这些对象的权限的角色。
如果您使用的是 30 天试用账户,则可使用为该账户创建的用户身份登录。该用户具有创建对象所需的权限的角色。
如果您没有 Snowflake 用户,则无法执行本教程。如果您没有可让您创建用户的角色,请要求有权限的人员为您执行此步骤。具有 ACCOUNTADMIN 或者 SECURITYADMIN 角色的用户可以创建用户。
安装 SnowSQL
要安装 SnowSQL,请参阅 安装 SnowSQL。
下载样本数据文件
要执行本教程,您需要使用 CSV 格式下载 Snowflake 提供的示例员工数据文件。
要下载并解压缩示例数据文件,请执行以下操作:
下载样本数据文件集。右键单击存档文件的名称,
getting-started.zip
,然后将链接/文件保存到本地文件系统。解压缩示例文件。本教程假设已将文件解压到下面其中一个目录:
Linux/macOS:
/tmp
Windows:
C:\\temp
每个文件有五个数据记录。数据使用逗号 (,) 字符作为字段分隔符。以下是示例记录:
Althea,Featherstone,afeatherstona@sf_tuts.com,"8172 Browning Street, Apt B",Calatrava,7/12/2017
每个记录中分隔字段的逗号前后没有空格。这是 Snowflake 在加载 CSV 数据时期望的默认值。
登录到 SnowSQL¶
安装 SnowSQL 之后,启动 SnowSQL 以连接到 Snowflake:
打开命令行窗口。
启动 SnowSQL:
$ snowsql -a <account_identifier> -u <user_name>
其中:
<account_identifier>
是您 Snowflake 账户的唯一标识符。账户标识符 的首选格式如下:
organization_name-account_name
Snowflake 组织和账户的名称。有关更多信息,请参阅 格式 1(首选):您所在组织的账户名称。
<user_name>
是您的 Snowflake 用户的登录名。
备注
如果您的账户已为您的账户定义了身份提供商 (IdP),则可以使用 Web 浏览器而不是密码进行身份验证,如以下示例所示:
$ snowsql -a <account_identifier> -u <user_name> --authenticator externalbrowser
有关更多信息,请参阅 使用 Web 浏览器进行联合身份验证/SSO。
当 SnowSQL 发出提示时,请输入您的 Snowflake 用户密码。
如果您登录成功,SnowSQL 显示命令提示符,其中包括您当前的仓库、数据库和架构。
备注
如果您被锁定在账户之外并且无法获取账户标识符,您可以在注册试用账户时 Snowflake 发送给您的欢迎电子邮件中找到它,或者您可以使用您的 ORGADMIN 获取账户详细信息。您还可以在欢迎电子邮件中找到 locator
、cloud
和 region
的值。
如果您的 Snowflake 用户没有默认的仓库、数据库和架构,或者您没有配置 SnowSQL 来指定默认仓库、数据库和架构,则提示将显示 no warehouse
、no database
和 no schema
。例如:
user-name#(no warehouse)@(no database).(no schema)>
该提示表明当前会话没有选择仓库、数据库和架构。您将在下一步中创建这些对象。当您按照本教程中的后续步骤创建这些对象时,提示会自动更新以包含这些对象的名称。
有关更多信息,请参阅 通过 SnowSQL 进行连接。
创建 Snowflake 对象¶
在此步骤中,您将创建以下 Snowflake 对象:
一个数据库 (
sf_tuts
) 和一个表 (emp_basic
)。您将示例数据加载到该表中。虚拟仓库 (
sf_tuts_wh
)。该仓库提供将数据加载到表中和查询表所需的计算资源。在本教程中,您将创建一个 X-小的仓库。
完成本教程后,您将删除这些对象。
创建数据库¶
使用 CREATE DATABASE 命令创建 sf_tuts
数据库:
CREATE OR REPLACE DATABASE sf_tuts;
在本教程中,您将使用每个数据库可用的默认架构 (public
),而不是创建新架构。
请注意,您刚刚创建的数据库和架构现在正在用于当前会话,如 SnowSQL 命令提示符中所示。您还可以使用上下文函数来获取此信息。
SELECT CURRENT_DATABASE(), CURRENT_SCHEMA();
以下是示例结果:
+--------------------+------------------+
| CURRENT_DATABASE() | CURRENT_SCHEMA() |
|--------------------+------------------|
| SF_TUTS | PUBLIC |
+--------------------+------------------+
创建表格¶
使用 CREATE TABLE 命令在 sf_tuts.public
下创建一个名为 emp_basic
的表:
CREATE OR REPLACE TABLE emp_basic (
first_name STRING ,
last_name STRING ,
email STRING ,
streetaddress STRING ,
city STRING ,
start_date DATE
);
请注意,表中的列数、列的位置和数据类型与您在本教程下一步中暂存的示例 CSV 数据文件中的字段相对应。
创建虚拟仓库¶
使用 CREATE WAREHOUSE 命令创建一个名为 sf_tuts_wh
的 X-小仓库:
CREATE OR REPLACE WAREHOUSE sf_tuts_wh WITH
WAREHOUSE_SIZE='X-SMALL'
AUTO_SUSPEND = 180
AUTO_RESUME = TRUE
INITIALLY_SUSPENDED=TRUE;
该 sf_tuts_wh
仓库最初已暂停,但 DML 语句仍设置为 AUTO_RESUME = true
。AUTO_RESUME 设置会导致在执行需要计算资源的 SQL 语句时自动启动仓库。
创建仓库后,它现在用于当前会话。此信息显示在 SnowSQL 命令提示符中。您还可以使用以下上下文函数检索仓库的名称:
SELECT CURRENT_WAREHOUSE();
以下是示例结果:
+---------------------+
| CURRENT_WAREHOUSE() |
|---------------------|
| SF_TUTS_WH |
+---------------------+
暂存数据文件¶
Snowflake 暂存区是云存储中的一个位置,用于从表中加载和卸载数据。Snowflake 支持以下暂存区类型:
内部暂存区 – 用于在 Snowflake 内部存储数据文件。Snowflake 中的每个用户和表默认都会获得一个内部暂存区来暂存数据文件。
外部暂存区 – 用于将数据文件存储在外部 Amazon S3、Google Cloud Storage 或 Microsoft Azure 中。如果您的数据已存储在这些云存储服务中,则可以使用外部暂存区将数据加载到 Snowflake 表中。
在本教程中,我们将示例数据文件(已在 先决条件 部分下载)上传到您之前创建的 emp_basic
表的内部暂存区。您使用 PUT 命令将示例数据文件上传到该暂存区。
暂存示例数据文件¶
在 SnowSQL 中执行 PUT,将本地数据文件上传到为您创建的 emp_basic
表提供的表暂存区。
PUT file://<file-path>[/\]employees0*.csv @sf_tuts.public.%emp_basic;
例如:
Linux 或 macOS
PUT file:///tmp/employees0*.csv @sf_tuts.public.%emp_basic;
Windows
PUT file://C:\temp\employees0*.csv @sf_tuts.public.%emp_basic;
我们来详细看看该命令:
file://<file-path>[/]employees0*.csv
指定本地计算机上要暂存的文件的完整目录路径和名称。请注意,可以使用文件系统通配符,如果多个文件符合该模式,则它们都会显示。@<namespace>.%<table_name>
指示使用指定表(在本例中为emp_basic
表)的暂存区。
该命令返回以下结果,显示暂存文件:
+-----------------+--------------------+-------------+-------------+--------------------+--------------------+----------+---------+
| source | target | source_size | target_size | source_compression | target_compression | status | message |
|-----------------+--------------------+-------------+-------------+--------------------+--------------------+----------+---------|
| employees01.csv | employees01.csv.gz | 360 | 287 | NONE | GZIP | UPLOADED | |
| employees02.csv | employees02.csv.gz | 355 | 274 | NONE | GZIP | UPLOADED | |
| employees03.csv | employees03.csv.gz | 397 | 295 | NONE | GZIP | UPLOADED | |
| employees04.csv | employees04.csv.gz | 366 | 288 | NONE | GZIP | UPLOADED | |
| employees05.csv | employees05.csv.gz | 394 | 299 | NONE | GZIP | UPLOADED | |
+-----------------+--------------------+-------------+-------------+--------------------+--------------------+----------+---------+
PUT 命令默认使用 gzip
压缩文件,如 TARGET_COMPRESSION 列中所示。
列出暂存文件(可选)¶
您可以使用以下 LIST 命令列出暂存文件。
LIST @sf_tuts.public.%emp_basic;
以下是示例结果:
+--------------------+------+----------------------------------+------------------------------+
| name | size | md5 | last_modified |
|--------------------+------+----------------------------------+------------------------------|
| employees01.csv.gz | 288 | a851f2cc56138b0cd16cb603a97e74b1 | Tue, 9 Jan 2018 15:31:44 GMT |
| employees02.csv.gz | 288 | 125f5645ea500b0fde0cdd5f54029db9 | Tue, 9 Jan 2018 15:31:44 GMT |
| employees03.csv.gz | 304 | eafee33d3e62f079a054260503ddb921 | Tue, 9 Jan 2018 15:31:45 GMT |
| employees04.csv.gz | 304 | 9984ab077684fbcec93ae37479fa2f4d | Tue, 9 Jan 2018 15:31:44 GMT |
| employees05.csv.gz | 304 | 8ad4dc63a095332e158786cb6e8532d0 | Tue, 9 Jan 2018 15:31:44 GMT |
+--------------------+------+----------------------------------+------------------------------+
将数据复制到目标表中¶
执行 COPY INTO <table> 可将暂存数据加载到目标表中。
COPY INTO <table> 命令使用您在 创建 Snowflake 对象 中创建的虚拟仓库复制文件。
COPY INTO emp_basic
FROM @%emp_basic
FILE_FORMAT = (type = csv field_optionally_enclosed_by='"')
PATTERN = '.*employees0[1-5].csv.gz'
ON_ERROR = 'skip_file';
其中:
FROM 子句指定包含数据文件的位置(表的内部暂存区)。
这 FILE_FORMAT 子句将文件类型指定为 CSV,并指定使用双引号字符 (
"
) 包围字符串。Snowflake 支持多种文件类型和选项。这些在 CREATE FILE FORMAT 中有说明。PATTERN 子句指定该命令应从与此正则表达式 (
.*employees0[1-5].csv.gz
) 匹配的文件名中加载数据。ON_ERROR 子句指定当 COPY 命令在文件中遇到错误时要执行的操作。默认情况下,该命令在遇到第一个错误时停止加载数据。此示例跳过任何包含错误的文件并继续加载下一个文件。(这仅用于说明目的;本教程中的任何文件均不包含错误。)
COPY 命令还提供了在加载文件之前验证文件的选项。有关其他错误检查和验证说明的详细信息,请参阅 COPY INTO <table> 主题和其他 数据加载教程。
COPY 命令返回一个结果,其中显示已复制的文件的名称和相关信息:
+--------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
| file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
|--------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
| employees02.csv.gz | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL |
| employees04.csv.gz | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL |
| employees05.csv.gz | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL |
| employees03.csv.gz | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL |
| employees01.csv.gz | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL |
+--------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
查询加载的数据¶
您可以使用标准 SQL 以及任何支持的 函数 和 运算符 查询 emp_basic
表中加载的数据。
您还可以使用标准 DML 命令 操作数据,例如更新加载的数据或插入更多数据。
检索所有数据¶
返回表中的所有行和列:
SELECT * FROM emp_basic;
以下为部分结果:
+------------+--------------+---------------------------+-----------------------------+--------------------+------------+
| FIRST_NAME | LAST_NAME | EMAIL | STREETADDRESS | CITY | START_DATE |
|------------+--------------+---------------------------+-----------------------------+--------------------+------------|
| Arlene | Davidovits | adavidovitsk@sf_tuts.com | 7571 New Castle Circle | Meniko | 2017-05-03 |
| Violette | Shermore | vshermorel@sf_tuts.com | 899 Merchant Center | Troitsk | 2017-01-19 |
| Ron | Mattys | rmattysm@sf_tuts.com | 423 Lien Pass | Bayaguana | 2017-11-15 |
...
...
...
| Carson | Bedder | cbedderh@sf_tuts.co.au | 71 Clyde Gallagher Place | Leninskoye | 2017-03-29 |
| Dana | Avory | davoryi@sf_tuts.com | 2 Holy Cross Pass | Wenlin | 2017-05-11 |
| Ronny | Talmadge | rtalmadgej@sf_tuts.co.uk | 588 Chinook Street | Yawata | 2017-06-02 |
+------------+--------------+---------------------------+-----------------------------+--------------------+------------+
另外插入数据行¶
除了将暂存文件中的数据加载到表中之外,您还可以使用 INSERT DML 命令将行直接插入表中。
例如,要向表中插入另外两行:
INSERT INTO emp_basic VALUES
('Clementine','Adamou','cadamou@sf_tuts.com','10510 Sachs Road','Klenak','2017-9-22') ,
('Marlowe','De Anesy','madamouc@sf_tuts.co.uk','36768 Northfield Plaza','Fangshan','2017-1-26');
根据电子邮件地址查询行¶
使用 [ NOT ] LIKE 函数返回具有英国顶级域的电子邮件地址列表:
SELECT email FROM emp_basic WHERE email LIKE '%.uk';
以下是示例结果:
+--------------------------+
| EMAIL |
|--------------------------|
| gbassfordo@sf_tuts.co.uk |
| rtalmadgej@sf_tuts.co.uk |
| madamouc@sf_tuts.co.uk |
+--------------------------+
根据开始日期查询行¶
例如,要计算某些员工福利的开始时间,请使用 DATEADD 函数在员工开始日期上添加 90 天。按开始日期早于 2017 年 1 月 1 日的员工筛选列表:
SELECT first_name, last_name, DATEADD('day',90,start_date) FROM emp_basic WHERE start_date <= '2017-01-01';
以下是示例结果:
+------------+-----------+------------------------------+
| FIRST_NAME | LAST_NAME | DATEADD('DAY',90,START_DATE) |
|------------+-----------+------------------------------|
| Granger | Bassford | 2017-03-30 |
| Catherin | Devereu | 2017-03-17 |
| Cesar | Hovie | 2017-03-21 |
| Wallis | Sizey | 2017-03-30 |
+------------+-----------+------------------------------+
总结、清理和其他资源¶
恭喜!您已成功完成本入门教程。
请花几分钟时间查看简短的总结和教程中涵盖的要点。您可能还需要考虑删除在教程中创建的任何对象进行清理。通过查看 Snowflake 文档中的其他主题了解更多信息。
总结和要点¶
总之,数据加载分两步进行:
暂存要加载的数据文件。这些文件可以在内部(在 Snowflake 中)暂存,也可以在外部位置暂存。在本教程中,您将在内部暂存文件。
将数据从暂存文件复制到现有目标表中。此步骤需要一个正在运行的仓库。
请记住以下有关加载 CSV 文件的要点:
CSV 文件包括 1 条或多条记录,每条记录中有 1 个或多个字段,有时还包含标头记录。
每个文件中的记录和字段由分隔符分隔。默认分隔符是:
- 记录:
换行符
- 字段:
逗号
换句话说,Snowflake 期望 CSV 文件中的每条记录都用换行符分隔,每个记录中的字段(即各个值)都用逗号分隔。如果使用 不同 的字符作为记录和字段分隔符,则必须在加载时将其 显式 指定为文件格式的一部分。
文件中的字段与您将加载的表中的列之间存在 直接 关联,具体如下:
字段(在文件中)和列(在目标表中)的数量。
字段和列在各自文件/表中的位置。
字段和列的数据类型,例如字符串、数字或日期。
如果数字、位置和数据类型与数据不对齐,则不会加载记录。
备注
Snowflake 支持加载字段与目标表中的列不完全对齐的文件。然而,这是一个更高级的数据加载主题(在 在加载期间转换数据 中介绍)。
教程清理(可选)¶
如果不再需要您在本教程中创建的对象,可以使用 DROP <object> 语句将它们从系统中删除。
DROP DATABASE IF EXISTS sf_tuts;
DROP WAREHOUSE IF EXISTS sf_tuts_wh;
退出连接¶
要退出连接,请使用 SnowSQL 的 !exit
命令(或其别名 !disconnect
)。
如果当前连接是最后一个连接,则退出将删除当前连接并且退出 SnowSQL。
下一步是什么?¶
请使用以下资源继续了解 Snowflake :
完成 Snowflake 提供的其他教程:
熟悉 Snowflake 的关键概念和功能,以及执行查询和插入/更新数据的 SQL 命令: