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,请先完成以下操作,然后继续:

  1. 创建用户

    要创建数据库、表和虚拟仓库,您必须以 Snowflake 用户身份登录,并具有授予您创建这些对象的权限的角色。

    • 如果您使用的是 30 天试用账户,则可使用为该账户创建的用户身份登录。该用户具有创建对象所需的权限的角色。

    • 如果您没有 Snowflake 用户,则无法执行本教程。如果您没有可让您创建用户的角色,请要求有权限的人员为您执行此步骤。具有 ACCOUNTADMIN 或者 SECURITYADMIN 角色的用户可以创建用户。

  2. 安装 SnowSQL

    要安装 SnowSQL,请参阅 安装 SnowSQL

  3. 下载样本数据文件

    要执行本教程,您需要使用 CSV 格式下载 Snowflake 提供的示例员工数据文件。

    要下载并解压缩示例数据文件,请执行以下操作:

    1. 下载样本数据文件集。右键单击存档文件的名称,getting-started.zip,然后将链接/文件保存到本地文件系统。

    2. 解压缩示例文件。本教程假设已将文件解压到下面其中一个目录:

    • Linux/macOS:/tmp

    • Windows:C:\\temp

    每个文件有五个数据记录。数据使用逗号 (,) 字符作为字段分隔符。以下是示例记录:

    Althea,Featherstone,afeatherstona@sf_tuts.com,"8172 Browning Street, Apt B",Calatrava,7/12/2017
    
    Copy

每个记录中分隔字段的逗号前后没有空格。这是 Snowflake 在加载 CSV 数据时期望的默认值。

登录到 SnowSQL

安装 SnowSQL 之后,启动 SnowSQL 以连接到 Snowflake:

  1. 打开命令行窗口。

  2. 启动 SnowSQL:

    $ snowsql -a <account_identifier> -u <user_name>
    
    Copy

    其中:

    备注

    如果您的账户已为您的账户定义了身份提供商 (IdP),则可以使用 Web 浏览器而不是密码进行身份验证,如以下示例所示:

    $ snowsql -a <account_identifier> -u <user_name> --authenticator externalbrowser
    
    Copy

    有关更多信息,请参阅 使用 Web 浏览器进行联合身份验证/SSO

  3. 当 SnowSQL 发出提示时,请输入您的 Snowflake 用户密码。

如果您登录成功,SnowSQL 显示命令提示符,其中包括您当前的仓库、数据库和架构。

备注

如果您被锁定在账户之外并且无法获取账户标识符,您可以在注册试用账户时 Snowflake 发送给您的欢迎电子邮件中找到它,或者您可以使用您的 ORGADMIN 获取账户详细信息。您还可以在欢迎电子邮件中找到 locatorcloudregion 的值。

如果您的 Snowflake 用户没有默认的仓库、数据库和架构,或者您没有配置 SnowSQL 来指定默认仓库、数据库和架构,则提示将显示 no warehouseno databaseno schema。例如:

user-name#(no warehouse)@(no database).(no schema)>
Copy

该提示表明当前会话没有选择仓库、数据库和架构。您将在下一步中创建这些对象。当您按照本教程中的后续步骤创建这些对象时,提示会自动更新以包含这些对象的名称。

有关更多信息,请参阅 通过 SnowSQL 进行连接

创建 Snowflake 对象

在此步骤中,您将创建以下 Snowflake 对象:

  • 一个数据库 (sf_tuts) 和一个表 (emp_basic)。您将示例数据加载到该表中。

  • 虚拟仓库 (sf_tuts_wh)。该仓库提供将数据加载到表中和查询表所需的计算资源。在本教程中,您将创建一个 X-小的仓库。

完成本教程后,您将删除这些对象。

创建数据库

使用 CREATE DATABASE 命令创建 sf_tuts 数据库:

CREATE OR REPLACE DATABASE sf_tuts;
Copy

在本教程中,您将使用每个数据库可用的默认架构 (public),而不是创建新架构。

请注意,您刚刚创建的数据库和架构现在正在用于当前会话,如 SnowSQL 命令提示符中所示。您还可以使用上下文函数来获取此信息。

SELECT CURRENT_DATABASE(), CURRENT_SCHEMA();
Copy

以下是示例结果:

+--------------------+------------------+
| 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
   );
Copy

请注意,表中的列数、列的位置和数据类型与您在本教程下一步中暂存的示例 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;
Copy

sf_tuts_wh 仓库最初已暂停,但 DML 语句仍设置为 AUTO_RESUME = true。AUTO_RESUME 设置会导致在执行需要计算资源的 SQL 语句时自动启动仓库。

创建仓库后,它现在用于当前会话。此信息显示在 SnowSQL 命令提示符中。您还可以使用以下上下文函数检索仓库的名称:

SELECT CURRENT_WAREHOUSE();
Copy

以下是示例结果:

+---------------------+
| 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;
Copy

例如:

  • Linux 或 macOS

    PUT file:///tmp/employees0*.csv @sf_tuts.public.%emp_basic;
    
    Copy
  • Windows

    PUT file://C:\temp\employees0*.csv @sf_tuts.public.%emp_basic;
    
    Copy

我们来详细看看该命令:

  • 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;
Copy

以下是示例结果:

+--------------------+------+----------------------------------+------------------------------+
| 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';
Copy

其中:

  • 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;
Copy

以下为部分结果:

+------------+--------------+---------------------------+-----------------------------+--------------------+------------+
| 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 |
+------------+--------------+---------------------------+-----------------------------+--------------------+------------+
Copy

另外插入数据行

除了将暂存文件中的数据加载到表中之外,您还可以使用 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');
Copy

根据电子邮件地址查询行

使用 [ NOT ] LIKE 函数返回具有英国顶级域的电子邮件地址列表:

SELECT email FROM emp_basic WHERE email LIKE '%.uk';
Copy

以下是示例结果:

+--------------------------+
| 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';
Copy

以下是示例结果:

+------------+-----------+------------------------------+
| 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 文档中的其他主题了解更多信息。

总结和要点

总之,数据加载分两步进行:

  1. 暂存要加载的数据文件。这些文件可以在内部(在 Snowflake 中)暂存,也可以在外部位置暂存。在本教程中,您将在内部暂存文件。

  2. 将数据从暂存文件复制到现有目标表中。此步骤需要一个正在运行的仓库。

请记住以下有关加载 CSV 文件的要点:

  • CSV 文件包括 1 条或多条记录,每条记录中有 1 个或多个字段,有时还包含标头记录。

  • 每个文件中的记录和字段由分隔符分隔。默认分隔符是:

    记录:

    换行符

    字段:

    逗号

    换句话说,Snowflake 期望 CSV 文件中的每条记录都用换行符分隔,每个记录中的字段(即各个值)都用逗号分隔。如果使用 不同 的字符作为记录和字段分隔符,则必须在加载时将其 显式 指定为文件格式的一部分。

  • 文件中的字段与您将加载的表中的列之间存在 直接 关联,具体如下:

    • 字段(在文件中)和列(在目标表中)的数量。

    • 字段和列在各自文件/表中的位置。

    • 字段和列的数据类型,例如字符串、数字或日期。

    如果数字、位置和数据类型与数据不对齐,则不会加载记录。

    备注

    Snowflake 支持加载字段与目标表中的列不完全对齐的文件。然而,这是一个更高级的数据加载主题(在 在加载期间转换数据 中介绍)。

教程清理(可选)

如果不再需要您在本教程中创建的对象,可以使用 DROP <object> 语句将它们从系统中删除。

DROP DATABASE IF EXISTS sf_tuts;

DROP WAREHOUSE IF EXISTS sf_tuts_wh;
Copy

退出连接

要退出连接,请使用 SnowSQL 的 !exit 命令(或其别名 !disconnect)。

如果当前连接是最后一个连接,则退出将删除当前连接并且退出 SnowSQL。

下一步是什么?

请使用以下资源继续了解 Snowflake :

语言: 中文