Carregamento e descarregamento de dados do Parquet

Este tutorial descreve como você pode carregar dados do Parquet transformando elementos de um arquivo Parquet preparado diretamente em colunas de tabela usando o comando COPY INTO <tabela>. O tutorial também descreve como você pode usar o comando COPY INTO <local> para descarregar os dados da tabela em um arquivo Parquet.

Neste tópico:

Pré-requisitos

Para este tutorial você vai precisar:

  • Baixe um arquivo de dados Parquet fornecido do Snowflake.

  • Crie um banco de dados, uma tabela e um warehouse virtual.

O banco de dados, tabela e warehouse virtual são objetos básicos do Snowflake necessários para a maioria das atividades do Snowflake.

Download do arquivo de dados de amostra

Para baixar a amostra do arquivo de dados Parquet, clique em cities.parquet. Opcionalmente, clique com o botão direito no link e salve o link/arquivo em seu sistema de arquivos local.

O tutorial considera que você tenha descompactado os arquivos nos seguintes diretórios:

  • Linux/macOS: /tmp/load

  • Windows: C:\tempload

O arquivo de dados Parquet inclui amostra de dados do continente. O seguinte é um exemplo representativo:

{
  "continent": "Europe",
  "country": {
    "city": [
      "Paris",
      "Nice",
      "Marseilles",
      "Cannes"
    ],
    "name": "France"
  }
}
Copy

Criação do banco de dados, tabela e warehouse virtual

Os seguintes comandos criam objetos especificamente para uso com este tutorial. Quando tiver concluído o tutorial, você poderá descartar esses objetos.

 create or replace database mydatabase;

 use schema mydatabase.public;

  create or replace temporary table cities (
    continent varchar default null,
    country varchar default null,
    city variant default null
  );

create or replace warehouse mywarehouse with
  warehouse_size='X-SMALL'
  auto_suspend = 120
  auto_resume = true
  initially_suspended=true;

use warehouse mywarehouse;
Copy

Observe que estes comandos criam uma tabela temporária. Uma tabela temporária existe apenas pela duração da sessão do usuário e não fica visível para os outros usuários.

Etapa 1: criar objetos de formato de arquivo

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

CREATE OR REPLACE FILE FORMAT sf_tut_parquet_format
  TYPE = parquet;
Copy

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

Etapa 2: criar objeto de preparação

Execute o comando CREATE STAGE para criar o estágio sf_tut_stage interno.

CREATE OR REPLACE TEMPORARY STAGE sf_tut_stage
FILE_FORMAT = sf_tut_parquet_format;
Copy

Assim como as tabelas temporárias, os estágios temporários são automaticamente descartados ao final da sessão.

Etapa 3: preparar arquivo de dados

Execute o comando PUT para carregar o arquivo Parquet de seu sistema de arquivos local no estágio nomeado.

  • Linux ou macOS

    PUT file:///tmp/load/cities.parquet @sf_tut_stage;
    
    Copy
  • Windows

    PUT file://C:\temp\load\cities.parquet @sf_tut_stage;
    
    Copy

Etapa 4: copiar dados na tabela de destino

Copie o arquivo de dados preparado cities.parquet na tabela CITIES.

copy into cities
 from (select $1:continent::varchar,
              $1:country:name::varchar,
              $1:country:city::variant
      from @sf_tut_stage/cities.parquet);
Copy

Observe o seguinte:

  • $1 na consulta SELECT refere-se à coluna única na qual os dados Parque são armazenados.

  • A consulta converte cada um dos valores do elemento Parquet que ele recupera em tipos de coluna específicos.

Execute a seguinte consulta para verificar se os dados foram copiados.

SELECT * from cities;
Copy

A consulta retorna o seguinte resultado:

+---------------+---------+-----------------+
| CONTINENT     | COUNTRY | CITY            |
|---------------+---------+-----------------|
| Europe        | France  | [               |
|               |         |   "Paris",      |
|               |         |   "Nice",       |
|               |         |   "Marseilles", |
|               |         |   "Cannes"      |
|               |         | ]               |
|---------------+---------+-----------------|
| Europe        | Greece  | [               |
|               |         |   "Athens",     |
|               |         |   "Piraeus",    |
|               |         |   "Hania",      |
|               |         |   "Heraklion",  |
|               |         |   "Rethymnon",  |
|               |         |   "Fira"        |
|               |         | ]               |
|---------------+---------+-----------------|
| North America | Canada  | [               |
|               |         |   "Toronto",    |
|               |         |   "Vancouver",  |
|               |         |   "St. John's", |
|               |         |   "Saint John", |
|               |         |   "Montreal",   |
|               |         |   "Halifax",    |
|               |         |   "Winnipeg",   |
|               |         |   "Calgary",    |
|               |         |   "Saskatoon",  |
|               |         |   "Ottawa",     |
|               |         |   "Yellowknife" |
|               |         | ]               |
+---------------+---------+-----------------+
Copy

Etapa 5: descarregar a tabela

Descarregue a tabela CITIES em outro arquivo Parquet.

Nota

Por padrão, o Snowflake otimiza as colunas da tabela em arquivos de dados Parquet descarregados, definindo a menor precisão que aceita todos os valores. Se você preferir um esquema de arquivo de saída consistente determinado pelos tipos de dados de colunas “lógicas” (isto é, os tipos na consulta SQL de descarregamento ou na tabela de origem), defina o parâmetro de sessão ENABLE_UNLOAD_PHYSICAL_TYPE_OPTIMIZATION como FALSE.

copy into @sf_tut_stage/out/parquet_
from (select continent,
             country,
             c.value::string as city
     from cities,
          lateral flatten(input => city) c)
  file_format = (type = 'parquet')
  header = true;
Copy

Observe o seguinte:

  • O file_format = (type = 'parquet') especifica o Parquet como o formato do arquivo de dados no estágio. Quando o tipo de arquivo Parquet é especificado, o comando COPY INTO <local> descarrega os dados em uma única coluna por padrão.

  • A opção header=true direciona o comando para manter os nomes das colunas no arquivo de saída.

  • Na consulta aninhada SELECT:

    • A função FLATTEN primeiro nivela os elementos da matriz de colunas city em colunas separadas.

    • O modificador LATERAL une a saída da função FLATTEN com informações fora do objeto - neste exemplo, continent e country.

Execute a seguinte consulta para verificar se os dados foram copiados no arquivo Parquet preparado.

select t.$1 from @sf_tut_stage/out/ t;
Copy

A consulta retorna os seguintes resultados (apenas o resultado parcial é mostrado):

+---------------------------------+
| $1                              |
|---------------------------------|
| {                               |
|   "CITY": "Paris",              |
|   "CONTINENT": "Europe",        |
|   "COUNTRY": "France"           |
| }                               |
|---------------------------------|
| {                               |
|   "CITY": "Nice",               |
|   "CONTINENT": "Europe",        |
|   "COUNTRY": "France"           |
| }                               |
|---------------------------------|
| {                               |
|   "CITY": "Marseilles",         |
|   "CONTINENT": "Europe",        |
|   "COUNTRY": "France"           |
| }                               |
+---------------------------------+
Copy

Etapa 6: remover arquivos de dados copiados com sucesso

Após verificar que copiou com sucesso os dados de seu estágio nas tabelas, você pode remover os arquivos de dados do estágio interno usando o comando REMOVE para salvar no armazenamento de dados.

REMOVE @sf_tut_stage/cities.parquet;
Copy

Etapa 7: limpeza

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.