教程:使用 COPY 从本地文件系统批量加载

本教程介绍如何将数据从本地文件系统中的文件加载到表中。

简介

在本教程中,您将学习如何进行以下操作:

  • 创建用于描述数据文件的命名文件格式对象。

  • 创建命名暂存区对象。

  • 将数据上传到内部暂存区。

  • 将数据加载到表中。

  • 解决数据文件中的错误。

本教程介绍如何加载 CSV 和 JSON 数据。

先决条件

本教程假设如下:

  • 您有一个 Snowflake 账户和一个用户,其角色授予创建数据库、表和虚拟仓库对象所需的权限。

  • 您已经安装了 SnowSQL。

20 分钟学会使用 Snowflake 教程提供满足这些要求的相关分步说明。

此外,在开始本教程之前,您需要完成以下操作:

  • 下载为本练习提供的示例文件。

  • 为本教程创建数据库、表和虚拟仓库。这些是大多数 Snowflake 活动所需的基本 Snowflake 对象。

下载示例数据文件

在本教程中,您需要下载 Snowflake 提供的示例数据文件。

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

  1. 右键点击归档文件的名称,data-load-internal.zip,并将链接/文件保存到本地文件系统。

  2. 解压缩示例文件。本教程假设已将文件解压到以下目录:

  • Linux/macOS:/tmp/load

  • Windows:C:\tempload

这些数据文件包括以下格式的示例联系人数据:

  • 包含一个标题行和五条记录的 CSV 文件。字段分隔符是竖线字符 (|)。以下示例显示了一个标题行和一条记录:

    ID|lastname|firstname|company|email|workphone|cellphone|streetaddress|city|postalcode
    6|Reed|Moses|Neque Corporation|eget.lacus@facilisis.com|1-449-871-0780|1-454-964-5318|Ap #225-4351 Dolor Ave|Titagarh|62631
    
    Copy
  • JSON 格式的单个文件包含一个数组和三个对象。下面是一个包含其中一个对象的数组示例:

    [
     {
       "customer": {
         "address": "509 Kings Hwy, Comptche, Missouri, 4848",
         "phone": "+1 (999) 407-2274",
         "email": "blankenship.patrick@orbin.ca",
         "company": "ORBIN",
         "name": {
           "last": "Patrick",
           "first": "Blankenship"
         },
         "_id": "5730864df388f1d653e37e6f"
       }
     },
    ]
    
    Copy

创建数据库、表和仓库

执行以下语句创建本教程所需的数据库、两个表(csv 和 json 数据表)和一个虚拟仓库。完成本教程后,您可以删除这些对象。

-- Create a database. A database automatically includes a schema named 'public'.

CREATE OR REPLACE DATABASE mydatabase;

/* Create target tables for CSV and JSON data. The tables are temporary, meaning they persist only for the duration of the user session and are not visible to other users. */

CREATE OR REPLACE TEMPORARY TABLE mycsvtable (
  id INTEGER,
  last_name STRING,
  first_name STRING,
  company STRING,
  email STRING,
  workphone STRING,
  cellphone STRING,
  streetaddress STRING,
  city STRING,
  postalcode STRING);

CREATE OR REPLACE TEMPORARY TABLE myjsontable (
  json_data VARIANT);

-- Create a warehouse

CREATE OR REPLACE WAREHOUSE mywarehouse WITH
  WAREHOUSE_SIZE='X-SMALL'
  AUTO_SUSPEND = 120
  AUTO_RESUME = TRUE
  INITIALLY_SUSPENDED=TRUE;
Copy

CREATE WAREHOUSE 语句设置最初要暂停的仓库。该语句还设置 AUTO_RESUME = true,这将在您执行需要计算资源的 SQL 语句时自动启动仓库。

第 1 步:创建文件格式对象

将数据文件从 S3 桶加载到表中时,您必须描述文件的格式并指定如何解释和处理文件中的数据。例如,如果要从 CSV 文件加载竖线分隔数据,则必须指定该文件使用带有竖线符号的 CSV 格式作为分隔符。

执行 COPY INTO <table> 命令时,请指定此格式信息。您可以将此信息指定为命令中的选项(例如 TYPE = CSVFIELD_DELIMITER = '|' 等),也可以指定包含此格式信息的文件格式对象。您可以使用 CREATE FILE FORMAT 命令创建已命名的文件格式对象。

在此步骤中,您将创建文件格式对象,该对象用于描述供本教程使用的示例 CSV 和 JSON 数据的数据格式。

为 CSV 数据创建文件格式对象

执行 CREATE FILE FORMAT 命令以创建 mycsvformat 文件格式。

CREATE OR REPLACE FILE FORMAT mycsvformat
  TYPE = 'CSV'
  FIELD_DELIMITER = '|'
  SKIP_HEADER = 1;
Copy

其中:

  • TYPE = 'CSV' 指示源文件格式类型。CSV 是默认文件格式类型。

  • FIELD_DELIMITER = '|' 指示“|”字符是字段分隔符。默认值为“,”。

  • SKIP_HEADER = 1 指示源文件包含一个标题行。此 COPY 命令在加载数据时跳过这些标题行。默认值为 0。

为 JSON 数据创建文件格式对象

执行 CREATE FILE FORMAT 命令以创建 myjsonformat 文件格式。

CREATE OR REPLACE FILE FORMAT myjsonformat
  TYPE = 'JSON'
  STRIP_OUTER_ARRAY = TRUE;
Copy

其中:

  • TYPE = 'JSON' 指示源文件格式类型。

  • STRIP_OUTER_ARRAY = TRUE 指示 COPY 命令在将数据加载到表时排除根括号 ([])。

第 2 步:创建暂存区对象

暂存区指定数据文件的存储位置(即“暂存”),以便可以将文件中的数据加载到表中。命名的 内部暂存区 是由 Snowflake 管理的云存储位置。

如果希望多个用户或进程上传文件,则创建命名的暂存区很有用。如果您计划暂存数据文件以便仅由您自己加载,或仅加载到单个表中,则您可能更喜欢使用用户暂存区或表暂存区。 有关信息,请参阅 从本地文件系统批量加载

在此步骤中,为不同类型的示例数据文件创建命名的暂存区。

为 CSV 数据文件创建暂存区

执行 CREATE STAGE 以创建 my_csv_stage 暂存区:

CREATE OR REPLACE STAGE my_csv_stage
  FILE_FORMAT = mycsvformat;
Copy

请注意,如果在创建暂存区时指定 FILE_FORMAT 选项,则无需在用于从暂存区加载数据的 COPY 命令中指定相同的 FILE_FORMAT 选项。

为 JSON 数据文件创建暂存区

执行 CREATE STAGE 以创建 my_json_stage 暂存区:

CREATE OR REPLACE STAGE my_json_stage
  FILE_FORMAT = myjsonformat;
Copy

第 3 步:暂存数据文件

执行 PUT,将(暂存区)示例数据文件从本地文件系统上传到在 教程:使用 COPY 从本地文件系统批量加载 中创建的暂存区。

暂存 CSV 示例数据文件

执行 PUT 命令以从本地文件系统上传 CSV 文件。

  • Linux 或 macOS

    PUT file:///tmp/load/contacts*.csv @my_csv_stage AUTO_COMPRESS=TRUE;
    
    Copy
  • Windows

    PUT file://C:\temp\load\contacts*.csv @my_csv_stage AUTO_COMPRESS=TRUE;
    
    Copy

让我们仔细看看命令:

  • file://<file-path>[/]contacts*.csv 指定本地计算机上要转移至暂存区的文件完整目录路径和名称。注意,允许使用文件系统通配符。

  • @my_csv_stage 是暂存数据的暂存区名称。

  • auto_compress=true; 指示命令在暂存时压缩数据。这也是默认设置。

该命令返回以下结果,显示暂存文件:

+---------------+------------------+-------------+-------------+--------------------+--------------------+----------+---------+
| source        | target           | source_size | target_size | source_compression | target_compression | status   | message |
|---------------+------------------+-------------+-------------+--------------------+--------------------+----------+---------|
| contacts1.csv | contacts1.csv.gz |         694 |         506 | NONE               | GZIP               | UPLOADED |         |
| contacts2.csv | contacts2.csv.gz |         763 |         565 | NONE               | GZIP               | UPLOADED |         |
| contacts3.csv | contacts3.csv.gz |         771 |         567 | NONE               | GZIP               | UPLOADED |         |
| contacts4.csv | contacts4.csv.gz |         750 |         561 | NONE               | GZIP               | UPLOADED |         |
| contacts5.csv | contacts5.csv.gz |         887 |         621 | NONE               | GZIP               | UPLOADED |         |
+---------------+------------------+-------------+-------------+--------------------+--------------------+----------+---------+
Copy

暂存 JSON 示例数据文件

执行 PUT 命令将本地文件系统中的 JSON 文件上传到指定的暂存区。

  • Linux 或 macOS

    PUT file:///tmp/load/contacts.json @my_json_stage AUTO_COMPRESS=TRUE;
    
    Copy
  • Windows

    PUT file://C:\temp\load\contacts.json @my_json_stage AUTO_COMPRESS=TRUE;
    
    Copy

该命令返回以下结果,显示暂存文件:

+---------------+------------------+-------------+-------------+--------------------+--------------------+----------+---------+
| source        | target           | source_size | target_size | source_compression | target_compression | status   | message |
|---------------+------------------+-------------+-------------+--------------------+--------------------+----------+---------|
| contacts.json | contacts.json.gz |         965 |         446 | NONE               | GZIP               | UPLOADED |         |
+---------------+------------------+-------------+-------------+--------------------+--------------------+----------+---------+
Copy

列出暂存文件(可选)

您可以使用 LIST 命令列出暂存文件。

CSV

LIST @my_csv_stage;
Copy

Snowflake 会返回暂存文件的列表。

JSON

LIST @my_json_stage;
Copy

Snowflake 会返回暂存文件的列表。

第 4 步:将数据复制到目标表中

执行 COPY INTO <table> 以将暂存数据加载到目标表中。

CSV

要从示例 CSV 文件加载数据,请执行以下操作:

  1. 首先从其中一个文件 (contacts1.csv.gz) 加载数据。执行以下命令:

    COPY INTO mycsvtable
      FROM @my_csv_stage/contacts1.csv.gz
      FILE_FORMAT = (FORMAT_NAME = mycsvformat)
      ON_ERROR = 'skip_file';
    
    Copy

    其中:

    • FROM 子句指定暂存数据文件的位置(暂存区名称后跟文件名)。

    • ON_ERROR 子句指定当 COPY 命令在文件中遇到错误时要执行的操作。默认情况下,该命令在遇到第一个错误时停止加载数据;但是,我们指示它跳过任何包含错误的文件并继续加载下一个文件。请注意,这仅用于说明目的;本教程中的任何文件均不包含错误。

    COPY 命令返回一个结果,其中显示已复制的文件的名称和相关信息:

    +-----------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
    | file                        | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
    |-----------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
    | mycsvtable/contacts1.csv.gz | LOADED |           5 |           5 |           1 |           0 |        NULL |             NULL |                  NULL |                    NULL |
    +-----------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
    
    Copy
  2. 加载 mycsvtable 表中其余的暂存文件。

    以下示例使用模式匹配将与正则表达式 .*contacts[1-5].csv.gz 匹配的所有文件中的数据加载到 mycsvtable 表中。

    COPY INTO mycsvtable
      FROM @my_csv_stage
      FILE_FORMAT = (FORMAT_NAME = mycsvformat)
      PATTERN='.*contacts[1-5].csv.gz'
      ON_ERROR = 'skip_file';
    
    Copy

    其中, PATTERN 子句指定该命令应从与此正则表达式 (.*employees0[1-5].csv.gz) 匹配的文件名中加载数据。

    COPY 命令返回一个结果,其中显示已复制的文件的名称和相关信息:

    +-----------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+
    | file                        | status      | rows_parsed | rows_loaded | error_limit | errors_seen | first_error                                                                                                                                                          | first_error_line | first_error_character | first_error_column_name |
    |-----------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------|
    | mycsvtable/contacts2.csv.gz | LOADED      |           5 |           5 |           1 |           0 | NULL                                                                                                                                                                 |             NULL |                  NULL | NULL                    |
    | mycsvtable/contacts3.csv.gz | LOAD_FAILED |           5 |           0 |           1 |           2 | Number of columns in file (11) does not match that of the corresponding table (10), use file format option error_on_column_count_mismatch=false to ignore this error |                3 |                     1 | "MYCSVTABLE"[11]        |
    | mycsvtable/contacts4.csv.gz | LOADED      |           5 |           5 |           1 |           0 | NULL                                                                                                                                                                 |             NULL |                  NULL | NULL                    |
    | mycsvtable/contacts5.csv.gz | LOADED      |           6 |           6 |           1 |           0 | NULL                                                                                                                                                                 |             NULL |                  NULL | NULL                    |
    +-----------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+
    
    Copy

    请注意结果中的以下亮点:

    • contacts1.csv.gz 中的数据将会忽略,因为您已成功加载数据。

    • 已成功加载以下文件中的数据:contacts2.csv.gzcontacts4.csv.gzcontacts5.csv.gz

    • 由于 2 个数据错误, contacts3.csv.gz 中的数据已跳过。本教程的下一步将介绍如何验证和修复错误。

JSON

contacts.json.gz 暂存数据文件加载到 myjsontable 表。

COPY INTO myjsontable
  FROM @my_json_stage/contacts.json.gz
  FILE_FORMAT = (FORMAT_NAME = myjsonformat)
  ON_ERROR = 'skip_file';
Copy

COPY 命令返回一个结果,其中显示已复制的文件的名称和相关信息:

+------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
| file                         | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
|------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
| myjsontable/contacts.json.gz | LOADED |           3 |           3 |           1 |           0 |        NULL |             NULL |                  NULL |                    NULL |
+------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
Copy

第 5 步:解决数据加载错误

在上一步中,COPY INTO 命令在遇到第一个错误时跳过加载其中一个文件。您需要找到所有错误并修复它们。在此步骤中,您将使用 VALIDATE 函数验证 COPY INTO 命令的之前执行并返回所有错误。

验证示例数据文件并检索所有错误

首先,需要与之前执行的 COPY INTO 命令关联的查询 ID。然后,调用 VALIDATE 函数,指定查询 ID。

  1. 检索查询 ID。

    1. 登录 Snowsight。

    2. 确保 Snowsight 中的角色与 SnowSQL 中用于运行本教程 SQL 语句的角色相同。

    3. 选择 Monitoring » Query History

    4. 选择特定 COPY INTO 命令行以打开查询信息窗格。

    5. 复制 Query ID 值。

  2. 验证由查询 ID 表示的 COPY INTO 命令执行,并将错误保存到名为 save_copy_errors 的新表中。

    1. 在 SnowSQL 中,执行以下命令。将 query_id 替换为 Query ID 值。

      CREATE OR REPLACE TABLE save_copy_errors AS SELECT * FROM TABLE(VALIDATE(mycsvtable, JOB_ID=>'<query_id>'));
      
      Copy
    2. 查询 save_copy_errors 表。

      SELECT * FROM SAVE_COPY_ERRORS;
      
      Copy

      查询将返回以下结果:

      +----------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------+------+-----------+-------------+----------+--------+-----------+-------------------------------+------------+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
      | ERROR                                                                                                                                                                | FILE                                | LINE | CHARACTER | BYTE_OFFSET | CATEGORY |   CODE | SQL_STATE | COLUMN_NAME                   | ROW_NUMBER | ROW_START_LINE | REJECTED_RECORD                                                                                                                                     |
      |----------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------+------+-----------+-------------+----------+--------+-----------+-------------------------------+------------+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------|
      | Number of columns in file (11) does not match that of the corresponding table (10), use file format option error_on_column_count_mismatch=false to ignore this error | mycsvtable/contacts3.csv.gz         |    3 |         1 |         234 | parsing  | 100080 |     22000 | "MYCSVTABLE"[11]              |          1 |              2 | 11|Ishmael|Burnett|Dolor Elit Pellentesque Ltd|vitae.erat@necmollisvitae.ca|1-872|600-7301|1-513-592-6779|P.O. Box 975, 553 Odio, Road|Hulste|63345 |
      | Field delimiter '|' found while expecting record delimiter '\n'                                                                                                      | mycsvtable/contacts3.csv.gz         |    5 |       125 |         625 | parsing  | 100016 |     22000 | "MYCSVTABLE"["POSTALCODE":10] |          4 |              5 | 14|Sophia|Christian|Turpis Ltd|lectus.pede@non.ca|1-962-503-3253|1-157-|850-3602|P.O. Box 824, 7971 Sagittis Rd.|Chattanooga|56188                  |
      +----------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------------------------------------+------+-----------+-------------+----------+--------+-----------+-------------------------------+------------+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------+
      
      Copy

结果显示 mycsvtable/contacts3.csv.gz 中的两个数据错误:

  • Number of columns in file (11) does not match that of the corresponding table (10)

    在第 1 行中,连字符被错误地替换为管道 (|) 字符,即数据文件分隔符,从而有效地在记录中创建了一个附加列。

    示例 1:记录中的数据错误
  • Field delimiter '|' found while expecting record delimiter 'n'

    在第 5 行中,在连字符之后引入了一个额外的管道 (|) 字符,打破了记录。

    示例 1:记录中的数据错误

修复错误并重新加载数据文件

  1. 在本地环境的 contacts3.csv 文件中手动修复记录中的错误。

  2. 使用 PUT 命令将修改后的数据文件上传到暂存区。修改后的文件将覆盖现有暂存文件。

    • Linux 或 macOS:

      PUT file:///tmp/load/contacts3.csv @my_csv_stage AUTO_COMPRESS=TRUE OVERWRITE=TRUE;
      
      Copy
    • Windows:

      PUT file://C:\temp\load\contacts3.csv @my_csv_stage AUTO_COMPRESS=TRUE OVERWRITE=TRUE;
      
      Copy
  3. 将暂存文件中的数据复制到表中。

    COPY INTO mycsvtable
      FROM @my_csv_stage/contacts3.csv.gz
      FILE_FORMAT = (FORMAT_NAME = mycsvformat)
      ON_ERROR = 'skip_file';
    
    Copy

Snowflake 返回以下结果,指示 contacts3.csv.gz 中的数据已成功加载。

+-----------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
| file                        | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
|-----------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
| mycsvtable/contacts3.csv.gz | LOADED |           5 |           5 |           1 |           0 |        NULL |             NULL |                  NULL |                    NULL |
+-----------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
Copy

验证加载的数据

执行 SELECT 查询,以验证数据是否已成功加载。

CSV

SELECT * FROM mycsvtable;
Copy

查询将返回以下结果:

+----+-----------+------------+----------------------------------+----------------------------------------+----------------+----------------+---------------------------------+------------------+------------+
| ID | LAST_NAME | FIRST_NAME | COMPANY                          | EMAIL                                  | WORKPHONE      | CELLPHONE      | STREETADDRESS                   | CITY             | POSTALCODE |
|----+-----------+------------+----------------------------------+----------------------------------------+----------------+----------------+---------------------------------+------------------+------------|
|  6 | Reed      | Moses      | Neque Corporation                | eget.lacus@facilisis.com               | 1-449-871-0780 | 1-454-964-5318 | Ap #225-4351 Dolor Ave          | Titagarh         |      62631 |
|  7 | Audrey    | Franks     | Arcu Eu Limited                  | eu.dui@aceleifendvitae.org             | 1-527-945-8935 | 1-263-127-1173 | Ap #786-9241 Mauris Road        | Bergen           |      81958 |
|  8 | Jakeem    | Erickson   | A Ltd                            | Pellentesque.habitant@liberoProinmi.ca | 1-381-591-9386 | 1-379-391-9490 | 319-1703 Dis Rd.                | Pangnirtung      |      62399 |
|  9 | Xaviera   | Brennan    | Bibendum Ullamcorper Limited     | facilisi.Sed.neque@dictum.edu          | 1-260-757-1919 | 1-211-651-0925 | P.O. Box 146, 8385 Vel Road     | Béziers          |      13082 |
| 10 | Francis   | Ortega     | Vitae Velit Egestas Associates   | egestas.rhoncus.Proin@faucibus.com     | 1-257-584-6487 | 1-211-870-2111 | 733-7191 Neque Rd.              | Chatillon        |      33081 |
| 16 | Aretha    | Sykes      | Lobortis Tellus Justo Foundation | eget@Naminterdumenim.net               | 1-670-849-1866 | 1-283-783-3710 | Ap #979-2481 Dui. Av.           | Thurso           |      66851 |
| 17 | Akeem     | Casey      | Pharetra Quisque Ac Institute    | dictum.eu@magna.edu                    | 1-277-657-0361 | 1-623-630-8848 | Ap #363-6074 Ullamcorper, Rd.   | Idar-Oberstei    |      30848 |
| 18 | Keelie    | Mendez     | Purus In Foundation              | Nulla.eu.neque@Aeneanegetmetus.co.uk   | 1-330-370-8231 | 1-301-568-0413 | 3511 Tincidunt Street           | Lanklaar         |      73942 |
| 19 | Lane      | Bishop     | Libero At PC                     | non@dapibusligula.ca                   | 1-340-862-4623 | 1-513-820-9039 | 7459 Pede. Street               | Linkebeek        |      89252 |
| 20 | Michelle  | Dickson    | Ut Limited                       | Duis.dignissim.tempor@cursuset.org     | 1-202-490-0151 | 1-129-553-7398 | 6752 Eros. St.                  | Stornaway        |      61290 |
| 20 | Michelle  | Dickson    | Ut Limited                       | Duis.dignissim.tempor@cursuset.org     | 1-202-490-0151 | 1-129-553-7398 | 6752 Eros. St.                  | Stornaway        |      61290 |
| 21 | Lance     | Harper     | Rutrum Lorem Limited             | Sed.neque@risus.com                    | 1-685-778-6726 | 1-494-188-6168 | 663-7682 Et St.                 | Gisborne         |      73449 |
| 22 | Keely     | Pace       | Eleifend Limited                 | ante.bibendum.ullamcorper@necenim.edu  | 1-312-381-5244 | 1-432-225-9226 | P.O. Box 506, 5233 Aliquam Av.  | Woodlands County |      61213 |
| 23 | Sage      | Leblanc    | Egestas A Consulting             | dapibus@elementum.org                  | 1-630-981-0327 | 1-301-287-0495 | 4463 Lorem Road                 | Woodlands County |      33951 |
| 24 | Marny     | Holt       | Urna Nec Luctus Associates       | ornare@vitaeorci.ca                    | 1-522-364-3947 | 1-460-971-8360 | P.O. Box 311, 4839 Nulla Av.    | Port Coquitlam   |      36733 |
| 25 | Holly     | Park       | Mauris PC                        | Vestibulum.ante@Maecenasliberoest.org  | 1-370-197-9316 | 1-411-413-4602 | P.O. Box 732, 8967 Eu Avenue    | Provost          |      45507 |
|  1 | Imani     | Davidson   | At Ltd                           | nec@sem.net                            | 1-243-889-8106 | 1-730-771-0412 | 369-6531 Molestie St.           | Russell          |      74398 |
|  2 | Kelsie    | Abbott     | Neque Sed Institute              | lacus@pede.net                         | 1-467-506-9933 | 1-441-508-7753 | P.O. Box 548, 1930 Pede. Road   | Campbellton      |      27022 |
|  3 | Hilel     | Durham     | Pede Incorporated                | eu@Craspellentesque.net                | 1-752-108-4210 | 1-391-449-8733 | Ap #180-2360 Nisl. Street       | Etalle           |      84025 |
|  4 | Graiden   | Molina     | Sapien Institute                 | sit@fermentum.net                      | 1-130-156-6666 | 1-269-605-7776 | 8890 A, Rd.                     | Dundee           |      70504 |
|  5 | Karyn     | Howard     | Pede Ac Industries               | sed.hendrerit@ornaretortorat.edu       | 1-109-166-5492 | 1-506-782-5089 | P.O. Box 902, 5398 Et, St.      | Saint-Hilarion   |      26232 |
| 11 | Ishmael   | Burnett    | Dolor Elit Pellentesque Ltd      | vitae.erat@necmollisvitae.ca           | 1-872-600-7301 | 1-513-592-6779 | P.O. Box 975, 553 Odio, Road    | Hulste           |      63345 |
| 12 | Ian       | Fields     | Nulla Magna Malesuada PC         | rutrum.non@condimentumDonec.co.uk      | 1-138-621-8354 | 1-369-126-7068 | P.O. Box 994, 7053 Quisque Ave  | Ostra Vetere     |      90433 |
| 13 | Xanthus   | Acosta     | Tortor Company                   | Nunc.lectus@a.org                      | 1-834-909-8838 | 1-693-411-2633 | 282-7994 Nunc Av.               | Belcarra         |      28890 |
| 14 | Sophia    | Christian  | Turpis Ltd                       | lectus.pede@non.ca                     | 1-962-503-3253 | 1-157-850-3602 | P.O. Box 824, 7971 Sagittis Rd. | Chattanooga      |      56188 |
| 15 | Dorothy   | Watson     | A Sollicitudin Orci Company      | diam.dictum@fermentum.co.uk            | 1-158-596-8622 | 1-402-884-3438 | 3348 Nec Street                 | Qu�bec City      |      63320 |
+----+-----------+------------+----------------------------------+----------------------------------------+----------------+----------------+---------------------------------+------------------+------------+
Copy

JSON

SELECT * FROM myjsontable;
Copy

查询将返回以下结果:

+-----------------------------------------------------------------+
| JSON_DATA                                                       |
|-----------------------------------------------------------------|
| {                                                               |
|   "customer": {                                                 |
|     "_id": "5730864df388f1d653e37e6f",                          |
|     "address": "509 Kings Hwy, Comptche, Missouri, 4848",       |
|     "company": "ORBIN",                                         |
|     "email": "blankenship.patrick@orbin.ca",                    |
|     "name": {                                                   |
|       "first": "Blankenship",                                   |
|       "last": "Patrick"                                         |
|     },                                                          |
|     "phone": "+1 (999) 407-2274"                                |
|   }                                                             |
| }                                                               |
| {                                                               |
|   "customer": {                                                 |
|     "_id": "5730864d4d8523c8baa8baf6",                          |
|     "address": "290 Lefferts Avenue, Malott, Delaware, 1575",   |
|     "company": "SNIPS",                                         |
|     "email": "anna.glass@snips.name",                           |
|     "name": {                                                   |
|       "first": "Anna",                                          |
|       "last": "Glass"                                           |
|     },                                                          |
|     "phone": "+1 (958) 411-2876"                                |
|   }                                                             |
| }                                                               |
| {                                                               |
|   "customer": {                                                 |
|     "_id": "5730864e375e08523150fc04",                          |
|     "address": "756 Randolph Street, Omar, Rhode Island, 3310", |
|     "company": "ESCHOIR",                                       |
|     "email": "sparks.ramos@eschoir.co.uk",                      |
|     "name": {                                                   |
|       "first": "Sparks",                                        |
|       "last": "Ramos"                                           |
|     },                                                          |
|     "phone": "+1 (962) 436-2519"                                |
|   }                                                             |
| }                                                               |
+-----------------------------------------------------------------+
Copy

第 6 步:移除成功复制的数据文件

确认已成功将数据从暂存区复制到表中后,可以使用 REMOVE 命令从内部暂存区中移除数据文件,从而保存到 数据存储 之中。

REMOVE @my_csv_stage PATTERN='.*.csv.gz';
Copy

Snowflake 返回以下结果:

+-------------------------------+---------+
| name                          | result  |
|-------------------------------+---------|
| my_csv_stage/contacts1.csv.gz | removed |
| my_csv_stage/contacts4.csv.gz | removed |
| my_csv_stage/contacts2.csv.gz | removed |
| my_csv_stage/contacts3.csv.gz | removed |
| my_csv_stage/contacts5.csv.gz | removed |
+-------------------------------+---------+
Copy
REMOVE @my_json_stage PATTERN='.*.json.gz';
Copy

Snowflake 返回以下结果:

+--------------------------------+---------+
| name                           | result  |
|--------------------------------+---------|
| my_json_stage/contacts.json.gz | removed |
+--------------------------------+---------+
Copy

第 7 步:清理

恭喜,您已成功完成本教程。

教程清理(可选)

执行以下 DROP <object> 命令,将系统恢复到教程开始前的状态:

DROP DATABASE IF EXISTS mydatabase;
DROP WAREHOUSE IF EXISTS mywarehouse;
Copy

删除数据库会自动移除所有子数据库对象,例如表。

其他数据加载教程

语言: 中文