Tutorial: carregamento em massa a partir do Amazon S3 usando COPY

Introdução

Este tutorial descreve como carregar em uma tabela dados de arquivos de um bucket existente do Amazon Simple Storage Service (Amazon S3). Neste tutorial, você aprenderá como:

  • Criar formatos de arquivos nomeados que descrevam seus arquivos de dados.

  • Criar objetos de preparação nomeados.

  • Carregar para as tabelas do Snowflake os dados localizados em seu bucket S3.

  • Resolver os erros em seus arquivos de dados.

O tutorial cobre o carregamento de dados CSV e JSON.

Pré-requisitos

O tutorial considera o seguinte:

  • Você tem uma conta Snowflake que está configurada para usar os Amazon Web Services (AWS) e um usuário com uma função que concede os privilégios necessários para criar um banco de dados, tabelas e objetos de warehouse virtual.

  • Você tem o SnowSQL instalado.

Consulte o Snowflake em 20 minutos para obter instruções para atender a estes requisitos.

O Snowflake fornece amostras de arquivos de dados em um bucket S3 público da Amazon para uso neste tutorial. Mas antes de começar, você precisa criar um banco de dados, tabelas e um warehouse virtual para este tutorial. Estes são os objetos básicos do Snowflake necessários para a maioria das atividades do Snowflake.

Sobre os arquivos de dados de amostra

O Snowflake fornece arquivos de dados de amostra preparados em um bucket S3 público.

Nota

Em uso regular, você prepararia seus próprios arquivos de dados usando o Console de gerenciamento da AWS, AWS Command Line Interface ou um aplicativo cliente equivalente. Consulte a documentação da Amazon Web Services para obter instruções.

Os arquivos de dados de amostra incluem informações de contato de amostra nos seguintes formatos:

  • Arquivos CSV que contêm uma linha de cabeçalho e cinco registros. O delimitador de campo é o caractere de canal (|). O exemplo a seguir mostra uma linha de cabeçalho e um registro:

    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
  • Um único arquivo no formato JSON que contém uma matriz e três objetos. A seguir, um exemplo de uma matriz que contém um dos objetos:

    [
     {
       "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

Criação do banco de dados, tabelas e warehouses

Execute as seguintes instruções para criar um banco de dados, duas tabelas (para dados csv e json) e um warehouse virtual necessário para este tutorial. Depois de concluir o tutorial, você poderá descartar estes objetos.

CREATE OR REPLACE DATABASE mydatabase;

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 OR REPLACE WAREHOUSE mywarehouse WITH
     WAREHOUSE_SIZE='X-SMALL'
     AUTO_SUSPEND = 120
     AUTO_RESUME = TRUE
     INITIALLY_SUSPENDED=TRUE;
Copy

Observe o seguinte:

  • A instrução CREATE DATABASE cria um banco de dados. O banco de dados inclui automaticamente um esquema chamado “public”.

  • As instruções CREATE TABLE criam tabelas de destino para dados CSV e JSON. As tabelas são temporárias, ou seja, elas existem apenas durante a sessão do usuário e não ficam visíveis para os outros usuários.

  • A instrução CREATE WAREHOUSE cria um warehouse inicialmente suspenso. A instrução também define AUTO_RESUME = true, que inicia automaticamente o warehouse quando você executa instruções SQL que exigem recursos computacionais.

Criação de objetos de formato de arquivo

Quando você carrega arquivos de dados de um bucket S3 em uma tabela, você deve descrever o formato do arquivo e especificar como os dados no arquivo devem ser interpretados e processados. Por exemplo, se você estiver carregando dados delimitados por barras verticais de um arquivo CSV, você deverá especificar que o arquivo usa o formato CSV com símbolos de barras verticais como delimitadores.

Quando você executa o comando COPY INTO <tabela>, você especifica esta informação de formato. Você pode especificar estas informações como opções no comando (por exemplo, TYPE = CSV, FIELD_DELIMITER = '|' etc.) ou pode especificar um objeto de formato de arquivo que contenha estas informações de formato. Você pode criar um objeto de formato de arquivo nomeado usando o comando CREATE FILE FORMAT.

Nesta etapa, você cria objetos de formato de arquivo descrevendo o formato dos dados de amostra CSV e JSON fornecidos para este tutorial.

Criação de um objeto de formato de arquivo para dados CSV

Execute o comando CREATE FILE FORMAT para criar o formato de arquivo mycsvformat.

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

Onde:

  • TYPE = 'CSV' indica o tipo de formato do arquivo de origem. CSV é o tipo de formato de arquivo padrão.

  • FIELD_DELIMITER = '|' indica que o caractere “|” é um separador de campo. O valor padrão é “,”.

  • SKIP_HEADER = 1 indica que o arquivo de origem inclui uma linha de cabeçalho. O comando COPY ignora essas linhas de cabeçalho ao carregar dados. O valor padrão é 0.

Criação de um objeto de formato de arquivo para dados JSON

Execute o comando CREATE FILE FORMAT para criar o formato de arquivo myjsonformat.

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

Onde:

  • TYPE = 'JSON' indica o tipo de formato do arquivo de origem.

  • STRIP_OUTER_ARRAY = TRUE direciona o comando COPY para excluir os colchetes ([]) ao carregar dados na tabela.

Criar objetos de preparação

Um estágio especifica onde os arquivos de dados são armazenados (isto é, “preparados”) para que os dados nos arquivos possam ser carregados em uma tabela. Um estágio externo nomeado é um local de armazenamento em nuvem gerenciado pelo Snowflake. Um estágio externo referencia arquivos de dados armazenados em um bucket S3. Neste caso, estamos criando um estágio que faz referência aos arquivos de dados de amostra necessários para completar o tutorial.

A criação de um estágio externo nomeado é útil se você quiser que vários usuários ou processos façam o carregamento de arquivos. Se você planeja preparar arquivos de dados para carregamento feito somente por você, ou carregar somente em uma única tabela, então você pode preferir usar seu estágio de usuário ou o estágio de tabela. Para obter mais informações, consulte Carregamento em massa a partir do Amazon S3.

Nesta etapa, você cria estágios nomeados para os diferentes tipos de arquivos de dados de amostra.

Criação de um estágio para arquivos de dados CSV

Execute CREATE STAGE para criar o estágio my_csv_stage:

CREATE OR REPLACE STAGE my_csv_stage
  FILE_FORMAT = mycsvformat
  URL = 's3://snowflake-docs';
Copy

Criação de um estágio para arquivos de dados JSON

Execute CREATE STAGE para criar o estágio my_json_stage:

CREATE OR REPLACE STAGE my_json_stage
  FILE_FORMAT = myjsonformat
  URL = 's3://snowflake-docs';
Copy

Nota

Em uso regular, se você estivesse criando um estágio que apontasse para seus arquivos de dados privados, você faria referência a uma integração de armazenamento criada usando CREATE STORAGE INTEGRATION por um administrador de conta (ou seja, um usuário com a função ACCOUNTADMIN) ou uma função com o privilégio global CREATE INTEGRATION:

CREATE OR REPLACE STAGE external_stage
  FILE_FORMAT = mycsvformat
  URL = 's3://private-bucket'
  STORAGE_INTEGRATION = myint;
Copy

Copiar dados para a tabela de destino

Execute COPY INTO <tabela> para carregar dados preparados nas tabelas de destino.

CSV

Para carregar os dados dos arquivos CSV de amostra:

  1. Comece carregando os dados de um dos arquivos no prefixo /tutorials/dataloading/ (pasta) chamado contacts1.csv na tabela mycsvtable. Execute o seguinte:

    COPY INTO mycsvtable
      FROM @my_csv_stage/tutorials/dataloading/contacts1.csv
      ON_ERROR = 'skip_file';
    
    Copy

    Onde:

    • A cláusula FROM especifica a localização do arquivo de dados preparado (nome do estágio seguido do nome do arquivo).

    • A cláusula ON_ERROR = 'skip_file' especifica o que fazer quando o comando COPY encontra erros nos arquivos. Se o comando encontrar um erro de dados em qualquer um dos registros, ele ignorará o arquivo. Se você não especificar uma cláusula ON_ERROR, o padrão será abort_statement, o que aborta o comando COPY no primeiro erro encontrado em qualquer um dos registros de um arquivo.

    O comando COPY retorna um resultado mostrando o nome do arquivo copiado e informações relacionadas:

    +---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
    | file                                                    | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
    |---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
    | s3://snowflake-docs/tutorials/dataloading/contacts1.csv | LOADED |           5 |           5 |           1 |           0 |        NULL |             NULL |                  NULL |                    NULL |
    +---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
    
    Copy
  2. Carregue o resto dos arquivos preparados na tabela mycsvtable.

    O exemplo a seguir usa a correspondência de padrões para carregar dados de arquivos que correspondem à expressão regular .*contacts[1-5].csv para a tabela mycsvtable.

    COPY INTO mycsvtable
      FROM @my_csv_stage/tutorials/dataloading/
      PATTERN='.*contacts[1-5].csv'
      ON_ERROR = 'skip_file';
    
    Copy

    Em que a cláusula PATTERN especifica que o comando deve carregar dados dos nomes dos arquivos que correspondem a esta expressão regular .*contacts[1-5].csv.

    O comando COPY retorna um resultado mostrando o nome do arquivo copiado e informações relacionadas:

    +---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+
    | file                                                    | status      | rows_parsed | rows_loaded | error_limit | errors_seen | first_error                                                                                                                                                          | first_error_line | first_error_character | first_error_column_name |
    |---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------|
    | s3://snowflake-docs/tutorials/dataloading/contacts2.csv | LOADED      |           5 |           5 |           1 |           0 | NULL                                                                                                                                                                 |             NULL |                  NULL | NULL                    |
    | s3://snowflake-docs/tutorials/dataloading/contacts3.csv | 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]        |
    | s3://snowflake-docs/tutorials/dataloading/contacts4.csv | LOADED      |           5 |           5 |           1 |           0 | NULL                                                                                                                                                                 |             NULL |                  NULL | NULL                    |
    | s3://snowflake-docs/tutorials/dataloading/contacts5.csv | LOADED      |           6 |           6 |           1 |           0 | NULL                                                                                                                                                                 |             NULL |                  NULL | NULL                    |
    +---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+
    
    Copy

    Observe os seguintes destaques no resultado:

    • Os dados em contacts1.csv são ignorados porque você já carregou os dados com sucesso.

    • Os dados contidos nestes arquivos foram carregados com sucesso: contacts2.csv, contacts4.csv e contacts5.csv.

    • Os dados em contacts3.csv foram ignorados devido a 2 erros de dados. A próxima etapa neste tutorial trata de como validar e corrigir os erros.

JSON

Carregue o arquivo de dados preparado contacts.json na tabela myjsontable.

COPY INTO myjsontable
  FROM @my_json_stage/tutorials/dataloading/contacts.json
  ON_ERROR = 'skip_file';
Copy

O COPY retorna um resultado mostrando o nome do arquivo copiado e informações relacionadas:

+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
| file                                                    | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
|---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
| s3://snowflake-docs/tutorials/dataloading/contacts.json | LOADED |           3 |           3 |           1 |           0 |        NULL |             NULL |                  NULL |                    NULL |
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
Copy

Limpeza

Parabéns, você concluiu esse tutorial com sucesso.

Tutorial de limpeza (opcional)

Execute os seguintes comandos DROP <objeto> para retornar o sistema ao seu estado antes de iniciar o tutorial:

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

Descartar o banco de dados remove automaticamente todos os objetos do banco de dados filho, tais como tabelas.

Outros tutoriais de carregamento de dados