Tutorial: Crie sua primeira tabela Apache Iceberg™

Introdução

Este tutorial aborda como criar Tabelas Apache Iceberg™ que usam o Snowflake como catálogo e oferecem suporte a operações de leitura e gravação. As tabelas Iceberg para Snowflake combinam o desempenho e a semântica de consulta de tabelas regulares do Snowflake com armazenamento em nuvem externo que você gerencia.

Complete este tutorial usando uma planilha no Snowsight ou usando um cliente Snowflake como SnowSQL. Você pode copiar e colar os exemplos de código e depois executá-los.

O que você aprenderá

Neste tutorial, você aprenderá a:

  • Criar e configurar um volume externo para tabelas Iceberg gerenciadas pelo Snowflake. Para fins de demonstração, o tutorial cria um volume externo para o Amazon S3.

  • Crie duas tabelas Iceberg que usam o Snowflake como catálogo Iceberg (tabelas gerenciadas pelo Snowflake).

  • Insira os dados nas tabelas Iceberg.

  • Consulte as tabelas Iceberg.

  • Exclua linhas de uma tabela Iceberg.

Pré-requisitos

Antes de começar, você deve estar familiarizado com o seguinte:

Você precisa de:

  • Um usuário Snowflake com uma função tem privilégios para executar as seguintes ações:

    Se estiver usando uma conta de avaliação de 30 dias, você pode fazer login como o usuário criado para a conta. Este usuário tem a função com os privilégios necessários para criar os objetos.

    Se você não tiver um usuário com as permissões necessárias, peça para alguém que tenha criar um para você. Usuários com a função ACCOUNTADMIN podem criar novos usuários e conceder a eles os privilégios necessários.

  • Acesso de administrador para seu provedor de armazenamento em nuvem para configurar um volume externo.

  • Um bucket de armazenamento (ou contêiner) com o mesmo provedor de nuvem, na mesma região que hospeda sua conta Snowflake.

  • Acesso ao banco de dados SNOWFLAKE_SAMPLE_DATA em sua conta. O Snowflake cria o banco de dados de amostra em novas contas por padrão. Se o banco de dados não foi criado em sua conta, consulte Uso do banco de dados de amostra.

Configuração de um warehouse e um banco de dados

Configure seu ambiente criando um warehouse e um banco de dados para este tutorial.

CREATE WAREHOUSE iceberg_tutorial_wh
  WAREHOUSE_TYPE = STANDARD
  WAREHOUSE_SIZE = XSMALL;

USE WAREHOUSE iceberg_tutorial_wh;

CREATE OR REPLACE DATABASE iceberg_tutorial_db;
USE DATABASE iceberg_tutorial_db;
Copy

Criação de um volume externo

Antes de criar uma tabela Apache Iceberg™ para o Snowflake, você precisa ter um volume externo. Um volume externo é um objeto Snowflake ao nível da conta que armazena uma entidade de gerenciamento de identidade e acesso (IAM) para seu armazenamento externo em nuvem.

O Snowflake usa o volume externo para se conectar com segurança ao seu armazenamento em nuvem e acessar dados de tabela e metadados.

Para fins de demonstração, esta etapa aborda como criar um volume externo para o Amazon S3. Para criar um volume externo para um serviço de armazenamento em nuvem diferente, consulte os seguintes tópicos:

Criação de um IAM política que conceda acesso ao seu local S3

Para configurar permissões de acesso para Snowflake no AWS Management Console, faça o seguinte:

  1. Faça login no AWS Management Console.

  2. No painel inicial, pesquise e selecione IAM.

  3. Selecione Account settings no painel de navegação à esquerda.

  4. Em Security Token Service (STS), na lista Endpoints, encontre a região do Snowflake onde sua conta está localizada. Se o STS status estiver inativo, mude o seletor para Active.

  5. Selecione Policies no painel de navegação à esquerda.

  6. Selecione Create Policy.

    Criar uma política de IAM no Console de gerenciamento AWS.
  7. Para Policy editor, selecione JSON.

  8. Adicione uma política para fornecer ao Snowflake as permissões necessárias para ler e gravar dados em seu local S3.

    O exemplo de política a seguir concede acesso a todos os locais no bucket especificado.

    Nota

    • Substitua my_bucket com o nome real de seu bucket. Você também pode especificar um caminho no bucket; por exemplo, my_bucket/path.

    • Definir a condição "s3:prefix": para ["*"] concede acesso a todos os prefixos no bucket especificado; defini-lo como ["path/*"] concede acesso a um caminho especificado no bucket.

    • Para buckets em regiões governamentais, os ARNs de bucket usam o prefixo arn:aws-us-gov:s3:::.

    {
       "Version": "2012-10-17",
       "Statement": [
             {
                "Effect": "Allow",
                "Action": [
                   "s3:PutObject",
                   "s3:GetObject",
                   "s3:GetObjectVersion",
                   "s3:DeleteObject",
                   "s3:DeleteObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<my_bucket>/*"
             },
             {
                "Effect": "Allow",
                "Action": [
                   "s3:ListBucket",
                   "s3:GetBucketLocation"
                ],
                "Resource": "arn:aws:s3:::<my_bucket>",
                "Condition": {
                   "StringLike": {
                         "s3:prefix": [
                            "*"
                         ]
                   }
                }
             }
       ]
    }
    
    Copy
  9. Selecione Next.

  10. Insira um Policy name (por exemplo, snowflake_access) e uma Description opcional.

  11. Selecione Create policy.

Crie uma função IAM

Crie uma função AWS IAM para conceder privilégios ao bucket S3 com seus arquivos de dados.

  1. Na seção de navegação à esquerda do painel de gerenciamento de identidade e acesso (IAM), selecione Roles.

  2. Selecione Create role.

  3. Para o tipo de entidade de confiança, selecione AWS account.

  4. Em An AWS account, selecione This account. Em uma etapa posterior, você modifica a relação de confiança e concede acesso ao Snowflake.

  5. Selecione a opção Require external ID. Insira um ID externo de sua escolha. Por exemplo, iceberg_table_external_id.

    Um ID externo é usado para conceder acesso aos seus recursos AWS (como buckets S3) a terceiros, como o Snowflake.

    Crie uma função IAM com um ID externo.
  6. Selecione Next.

  7. Selecione a política que você criou para o volume externo e selecione Next.

  8. Insira um Role name e uma descrição para a função e selecione Create role.

    Agora você criou uma política IAM para um local S3, criou uma função IAM e anexou a política à função.

  9. Selecione View role para exibir a página de resumo da função. Localize e registre o valor do nome de recurso da Amazon (ARN) para a função.

    Banner com link para visualizar a nova função IAM.

Criação de um volume externo no Snowflake

Crie um volume externo usando o comando CREATE EXTERNAL VOLUME. O exemplo a seguir cria um volume externo nomeado iceberg_external_volume, que define um local de armazenamento único do Amazon S3 com criptografia.

CREATE OR REPLACE EXTERNAL VOLUME iceberg_external_volume
   STORAGE_LOCATIONS =
      (
         (
            NAME = 'my-s3-us-west-2'
            STORAGE_PROVIDER = 'S3'
            STORAGE_BASE_URL = 's3://<my_bucket>/'
            STORAGE_AWS_ROLE_ARN = '<arn:aws:iam::123456789012:role/myrole>'
            STORAGE_AWS_EXTERNAL_ID = 'iceberg_table_external_id'
         )
      );
Copy

O exemplo especifica o ID externo (iceberg_table_external_id) associado à função IAM que você criou para o volume externo. Especificar um ID externo permite que você use a mesma função IAM (e ID externo) em vários volumes externos.

Nota

Especifique ARNs exatamente conforme fornecido pela AWS. ARNs não diferenciam maiúsculas e minúsculas.

Recuperação do usuário AWS IAM para sua conta Snowflake

  1. Recupere o ARN do usuário AWS IAM criado automaticamente para sua conta Snowflake, usando o comando DESCRIBE EXTERNAL VOLUME. Especifique o nome do seu volume externo.

    O exemplo a seguir descreve um volume externo nomeado iceberg_external_volume.

    DESC EXTERNAL VOLUME iceberg_external_volume;
    
    Copy
  2. Registre o valor para a propriedade STORAGE_AWS_IAM_USER_ARN, que é o usuário AWS IAM criado para sua conta Snowflake; por exemplo, arn:aws:iam::123456789001:user/abc1-b-self1234.

    O Snowflake fornece um único usuário IAM para toda a sua conta Snowflake. Todos os volumes externos S3 da sua conta usam esse usuário IAM.

    Nota

    Se você não especificou um ID externo (STORAGE_AWS_EXTERNAL_ID) ao criar um volume externo, o Snowflake gerará um ID para você usar. Registre o valor para que você possa atualizar sua política de confiança da função IAM com o ID externo gerado.

Concessão de permissões ao usuário IAM para acessar objetos bucket

Nesta etapa, você configura permissões que permitem que o usuário IAM da sua conta Snowflake acesse objetos no seu bucket S3.

  1. Faça login no AWS Management Console.

  2. No painel inicial, pesquise e selecione IAM.

  3. Selecione Roles no painel de navegação à esquerda.

  4. Selecione a função IAM que você criou para seu volume externo.

  5. Selecione a guia Trust relationships.

  6. Selecione Edit trust policy.

  7. Modifique o documento de política com valores de saída DESC EXTERNAL VOLUME que você registrou.

    Atualize a política de confiança para a função IAM.

    Documento de política da função IAM

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "<snowflake_user_arn>"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<iceberg_table_external_id>"
            }
          }
        }
      ]
    }
    
    Copy

    Onde:

    • snowflake_user_arn é o valor STORAGE_AWS_IAM_USER_ARN que você registrou.

    • iceberg_table_external_id é seu ID externo. Se você especificou um ID externo ao criar a função e usou o mesmo ID para criar seu volume externo, deixe o valor como está. Caso contrário, atualize sts:ExternalId com o valor que você registrou.

    Nota

    Você deverá atualizar este documento de política se criar um novo volume externo (ou recriar um volume externo existente usando a sintaxe CREATE OR REPLACE EXTERNAL VOLUME) e não fornecer seu próprio ID externo. Por motivos de segurança, um volume externo novo ou recriado tem um ID externo diferente e não pode resolver a relação de confiança, a menos que você atualize esta política de confiança.

  8. Selecione Update policy para salvar suas alterações.

Criação de uma tabela

Nesta etapa, você criará duas tabelas Apache Iceberg™: uma com a sintaxe padrão CREATE ICEBERG TABLE e outra com a variante CREATE ICEBERG TABLE … AS SELECT. Ambas tabelas usam o volume externo configurado na etapa anterior.

Você também aprenderá a definir o catálogo Iceberg e o volume externo ao nível do banco de dados.

Criar uma tabela usando a sintaxe padrão

Primeiro, crie uma tabela Iceberg usando a sintaxe padrão CREATE ICEBERG TABLE.

Especifique CATALOG = 'SNOWFLAKE' para que a tabela use Snowflake como catálogo Iceberg.

Para informar ao Snowflake onde gravar os dados da tabela e os metadados, especifique um valor para o parâmetro BASE_LOCATION. O exemplo define o nome da tabela (customer_iceberg) como o BASE_LOCATION. Dessa forma, o Snowflake grava dados e metadados em um diretório com o mesmo nome de tabela no local de seu volume externo.

CREATE OR REPLACE ICEBERG TABLE customer_iceberg (
    c_custkey INTEGER,
    c_name STRING,
    c_address STRING,
    c_nationkey INTEGER,
    c_phone STRING,
    c_acctbal INTEGER,
    c_mktsegment STRING,
    c_comment STRING
)
    CATALOG = 'SNOWFLAKE'
    EXTERNAL_VOLUME = 'iceberg_external_volume'
    BASE_LOCATION = 'customer_iceberg';
Copy

Mais adiante no tutorial, você carregará dados nesta tabela a partir da tabela snowflake_sample_data.tpch_sf1.customer no banco de dados SNOWFLAKE_SAMPLE_DATA. As definições de coluna na instrução CREATE ICEBERG TABLE correspondem à tabela de exemplo.

Nota

Se você verificar seu local de armazenamento em nuvem, agora deverá ver um diretório nomeado metadata/ que o Snowflake gravou durante a criação da tabela em sua BASE_LOCATION. O diretório armazena os arquivos de metadados da tabela.

Definir a integração do catálogo e o volume externo para o banco de dados

Em seguida, defina os parâmetros de CATALOG e EXTERNAL_VOLUME para o iceberg_tutorial_db que você criou neste tutorial. A definição dos parâmetros informa ao Snowflake para usar o catálogo específico e o volume externo que você escolher para todas as tabelas Iceberg criadas após a alteração.

ALTER DATABASE iceberg_tutorial_db SET CATALOG = 'SNOWFLAKE';
ALTER DATABASE iceberg_tutorial_db SET EXTERNAL_VOLUME = 'iceberg_external_volume';
Copy

Para verificar, confira os parâmetros do banco de dados atual (iceberg_tutorial_db):

SHOW PARAMETERS IN DATABASE ;
Copy

Criar uma tabela usando CTAS

Por fim, crie uma segunda tabela Iceberg chamada nation_iceberg usando a sintaxe CREATE ICEBERG TABLE … AS SELECT. Basearemos a nova tabela na tabela snowflake_sample_data.tpch_sf1.nation no banco de dados de exemplo Snowflake.

Nota

Já que você acabou de definir os parâmetros de CATALOG e EXTERNAL_VOLUME para o banco de dados iceberg_tutorial_db, você pode omitir ambos os parâmetros da instrução CREATE ICEBERG TABLE. A tabela nation_iceberg herdará os valores do banco de dados.

CREATE OR REPLACE ICEBERG TABLE nation_iceberg (
  n_nationkey INTEGER,
  n_name STRING
)
  BASE_LOCATION = 'nation_iceberg'
  AS SELECT
    N_NATIONKEY,
    N_NAME
  FROM snowflake_sample_data.tpch_sf1.nation;
Copy

Carregamento de dados e consulta de tabelas

Nesta etapa, você começa carregando os dados do banco de dados de exemplo do Snowflake para a tabela customer_iceberg usando INSERT INTO <table>:

INSERT INTO customer_iceberg
  SELECT * FROM snowflake_sample_data.tpch_sf1.customer;
Copy

Nota

Se você verificar seu local de armazenamento em nuvem, agora deverá ver um diretório com os arquivos de dados da tabela no seguinte caminho: STORAGE_BASE_URL/BASE_LOCATION/customer_iceberg/data/.

Agora que há dados na tabela, você pode consultá-la. A consulta a seguir une a tabela customer_iceberg com a tabela nation_iceberg (que já contém dados).

SELECT
    c.c_name AS customer_name,
    c.c_mktsegment AS market_segment,
    n.n_name AS nation
  FROM customer_iceberg c
  INNER JOIN nation_iceberg n
    ON c.c_nationkey = n.n_nationkey
  LIMIT 15;
Copy

Saída:

+--------------------+----------------+----------------+
| CUSTOMER_NAME      | MARKET_SEGMENT | NATION         |
|--------------------+----------------+----------------|
| Customer#000015001 | HOUSEHOLD      | MOROCCO        |
| Customer#000015002 | BUILDING       | VIETNAM        |
| Customer#000015003 | BUILDING       | INDONESIA      |
| Customer#000015004 | FURNITURE      | SAUDI ARABIA   |
| Customer#000015005 | HOUSEHOLD      | KENYA          |
| Customer#000015006 | BUILDING       | UNITED KINGDOM |
| Customer#000015007 | MACHINERY      | FRANCE         |
| Customer#000015008 | HOUSEHOLD      | INDIA          |
| Customer#000015009 | FURNITURE      | EGYPT          |
| Customer#000015010 | HOUSEHOLD      | ETHIOPIA       |
| Customer#000015011 | FURNITURE      | UNITED KINGDOM |
| Customer#000015012 | BUILDING       | FRANCE         |
| Customer#000015013 | FURNITURE      | SAUDI ARABIA   |
| Customer#000015014 | HOUSEHOLD      | KENYA          |
| Customer#000015015 | MACHINERY      | ROMANIA        |
+--------------------+----------------+----------------+

Excluir linhas

Nesta etapa, você usa uma instrução DELETE para remover linhas específicas da tabela customer_iceberg.

Comece consultando as 10 primeiras linhas da tabela e observe que quatro linhas pertencem ao segmento de mercado AUTOMOBILE:

SELECT
    c_name AS customer_name,
    c_mktsegment AS market_segment
  FROM customer_iceberg
  LIMIT 10;
Copy

Saída:

+--------------------+----------------+
| CUSTOMER_NAME      | MARKET_SEGMENT |
|--------------------+----------------|
| Customer#000000001 | BUILDING       |
| Customer#000000002 | AUTOMOBILE     |
| Customer#000000003 | AUTOMOBILE     |
| Customer#000000004 | MACHINERY      |
| Customer#000000005 | HOUSEHOLD      |
| Customer#000000006 | AUTOMOBILE     |
| Customer#000000007 | AUTOMOBILE     |
| Customer#000000008 | BUILDING       |
| Customer#000000009 | FURNITURE      |
| Customer#000000010 | HOUSEHOLD      |
+--------------------+----------------+

Em seguida, vamos usar uma instrução DELETE para remover todas as linhas da tabela onde está o segmento de mercado AUTOMOBILE:

DELETE FROM customer_iceberg WHERE c_mktsegment = 'AUTOMOBILE';
Copy

Saída:

+------------------------+
| number of rows deleted |
|------------------------|
|                  29752 |
+------------------------+

Por fim, você pode conferir se as linhas desapareceram:

SELECT
    c_name AS customer_name,
    c_mktsegment AS market_segment
 FROM customer_iceberg
 WHERE c_mktsegment = 'AUTOMOBILE';
Copy

Saída:

+---------------+----------------+
| CUSTOMER_NAME | MARKET_SEGMENT |
|---------------+----------------|
+---------------+----------------+
0 Row(s) produced. Time Elapsed: 1.426s

Parabéns!

Você acabou de escrever, ler e modificar suas primeiras tabelas Iceberg gerenciadas pelo Snowflake. Você também aprendeu a configurar um volume externo para armazenamento de tabelas Iceberg e definir o catálogo Iceberg e o volume externo para todas as tabelas Iceberg em um banco de dados.

Limpeza

Para excluir todos os objetos criados para este tutorial, execute as seguintes instruções DROP.

Substitua os seguintes valores:

  • my_other_database pelo nome de um banco de dados a ser usado para que você possa descartar aquele criado para este tutorial.

  • my_other_warehouse pelo nome do volume externo que você criou.

DROP ICEBERG TABLE customer_iceberg;
DROP ICEBERG TABLE nation_iceberg;
DROP EXTERNAL VOLUME iceberg_external_volume;
USE DATABASE <my_other_database>;
DROP DATABASE iceberg_tutorial_db;
USE WAREHOUSE <my_other_warehouse>;
DROP WAREHOUSE iceberg_tutorial_wh;
Copy

Resumo e recursos adicionais

Neste tutorial, você seguiu um fluxo de trabalho completo para criar e usar tabelas Apache Iceberg™ gerenciadas pelo Snowflake.

Durante o processo, você concluiu as seguintes tarefas:

Para saber mais sobre as tabelas Iceberg para Snowflake, consulte a documentação das tabelas Iceberg. Para mais tutoriais e guias de início rápido de tabelas Iceberg, consulte a página Tutoriais Snowflake.