Suporte de gravação para tabelas Apache Iceberg™ gerenciadas externamente

O suporte de gravação para tabelas Tabelas Apache Iceberg™ gerenciadas externamente permite que você execute operações de gravação em tabelas gerenciadas por um catálogo externo do Iceberg REST. A tabela Iceberg no Snowflake é vinculada a uma tabela no seu catálogo remoto. Quando você faz alterações na tabela no Snowflake, ele confirma as mesmas alterações no seu catálogo remoto.

Esse recurso em versão preliminar expande a interoperabilidade entre o Snowflake e sistemas de terceiros, permitindo que você use o Snowflake para cargas de trabalho de engenharia de dados com o Iceberg, mesmo quando você usa um catálogo externo do Iceberg.

Os principais casos de uso incluem o seguinte:

  • Construção de pipelines complexos de engenharia de dados com tabelas Iceberg: Gravar em tabelas Iceberg em catálogos externos do Snowflake permite usar o Snowpark ou o Snowflake SQL para construir pipelines complexos que ingerem, transformam e processam dados para tabelas Iceberg. Você pode consultar os dados usando o Snowflake ou outros mecanismos. Da mesma forma, você pode usar as ferramentas parceiras do Snowflake para construir seus pipelines de engenharia de dados do Iceberg.

  • Disponibilização dos seus dados para o ecossistema Iceberg: A capacidade de gravar em tabelas Iceberg em catálogos externos permite que você disponibilize seus dados para o ecossistema Iceberg. Você pode consultar dados que já estão no Snowflake e gravá-los em tabelas Iceberg. Para manter suas tabelas Iceberg sincronizadas com as tabelas Snowflake, você pode usar operações como INSERT INTO … SELECT FROM para fazer o seguinte:

    • Copiar dados existentes de uma tabela Snowflake padrão para uma tabela Iceberg.

    • Inserir dados com fluxos do Snowflake.

Considerações

Considere o seguinte ao usar o suporte de gravação para tabelas Iceberg gerenciadas externamente:

  • O Snowflake fornece comandos de Linguagem de Definição de Dados (DDL) e Linguagem de Manipulação de Dados (DML) para tabelas gerenciadas externamente. No entanto, você configura retenção de dados e metadados usando seu catálogo externo e as ferramentas fornecidas pelo seu provedor de armazenamento externo. Para obter mais informações, consulte Tabelas que usam um catálogo externo.

    Para gravações, o Snowflake garante que as alterações sejam confirmadas no seu catálogo remoto antes de atualizar a tabela no Snowflake.

  • Se você usar um banco de dados vinculado a catálogo, poderá usar a sintaxe CREATE ICEBERG TABLE com definições de coluna para criar uma tabela no Snowflake e no seu catálogo remoto. Se você usar um banco de dados Snowflake padrão (não vinculado a catálogo), deverá primeiro criar uma tabela no seu catálogo remoto. Depois disso, você poderá usar a sintaxe CREATE ICEBERG TABLE (catálogo REST Iceberg) para criar uma tabela Iceberg no Snowflake e gravar nela.

  • Para o catálogo de dados do AWS Glue: Remover uma tabela gerenciada externamente por meio do Snowflake não exclui os arquivos da tabela subjacente. Esse comportamento é específico da implementação do catálogo de dados do AWS Glue.

  • Se você tiver participado da versão preliminar privada deste recurso, as exclusões em nível de linha de posição poderão estar ativadas por padrão na sua conta. Para verificar, execute o seguinte comando:

    SHOW PARAMETERS LIKE 'ENABLE_ICEBERG_MERGE_ON_READ' IN ACCOUNT;
    
    Copy

    Se o parâmetro estiver visível na sua conta (independentemente do valor), as exclusões de posição estarão ativadas. Para desativar as exclusões de posição, defina o parâmetro ENABLE_ICEBERG_MERGE_ON_READ como FALSE no nível da tabela, do esquema ou do banco de dados.

  • Não há suporte para gravação em tabelas gerenciadas externamente com os seguintes tipos de dados Iceberg:

    • uuid

    • fixed(L)

  • Os seguintes recursos não são aceitos atualmente quando você usa o Snowflake para gravar em tabelas Iceberg gerenciadas externamente:

    • Credenciais fornecidas pelo catálogo.

    • Criptografia do lado do servidor (SSE) para volumes externos GCS ou do Azure.

    • Transações com várias instruções. O Snowflake oferece suporte apenas a transações de confirmação automática.

    • Conversão em tabelas gerenciadas pelo Snowflake.

    • Catálogos Iceberg externos que não estão em conformidade com o protocolo Iceberg REST.

    • Exclusões em nível de linha (mesclagem na leitura).

    • Uso da opção OR REPLACE ao criar uma tabela.

    • Uso da sintaxe CREATE TABLE … AS SELECT se você usar o AWS Glue como seu catálogo remoto.

  • Para criar esquemas em um banco de dados vinculado a catálogo, esteja ciente do seguinte:

    • O comando CREATE SCHEMA cria um namespace correspondente no seu catálogo remoto somente quando você usa um banco de dados vinculado a catálogo.

    • As opções ALTER e CLONE não são aceitas.

    • Delimitadores não são aceitos para nomes de esquema. Somente nomes de esquema alfanuméricos são aceitos.

Fluxo de trabalho

Use o fluxo de trabalho desta seção para começar a usar este recurso:

  1. Configurar um volume externo

  2. Criar uma integração de catálogo

  3. Escolha entre as seguintes opções:

    • Criar um banco de dados vinculado a catálogo. Com essa opção, você pode gravar em tabelas Iceberg descobertas automaticamente no seu catálogo ou usar o banco de dados vinculado a catálogo para criar tabelas Iceberg adicionais.

    • Criar uma tabela Iceberg (em um banco de dados vinculado a catálogo ou em um banco de dados Snowflake padrão). Com essa opção, você deve primeiro criar uma tabela no seu catálogo remoto antes de criar uma tabela Iceberg gerenciada externamente no Snowflake.

Após concluir essas etapas, você poderá executar operações de gravação em suas tabelas Iceberg.

Configuração de um volume externo para gravações em tabelas gerenciadas externamente

Para ativar gravações em tabelas gerenciadas externamente, você deve usar um volume externo configurado com permissões de leitura e gravação para a entidade de serviço do Snowflake (as mesmas permissões necessárias para tabelas gerenciadas pelo Snowflake).

Especifique o local de armazenamento (STORAGE_BASE_URL) em que seu catálogo Iceberg REST grava dados e metadados do Iceberg.

Por exemplo, a instrução a seguir cria um volume externo para o S3 com criptografia que permite acesso de gravação a um bucket denominado my-iceberg-tables:

CREATE OR REPLACE EXTERNAL VOLUME my_external_volume
  STORAGE_LOCATIONS =
    (
      (
        NAME = 'my-s3-us-west-2'
        STORAGE_PROVIDER = 'S3'
        STORAGE_BASE_URL = 's3://my-iceberg-tables/'
        STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/my-write-access-role'
        ENCRYPTION = ( TYPE = 'AWS_SSE_S3' )
      )
    )
  ALLOW_WRITES = TRUE;
Copy

Nota

Você deve configurar o volume externo com permissões de leitura e gravação e definir o parâmetro ALLOW_WRITES como TRUE.

Para obter instruções completas, consulte os seguintes tópicos:

Para obter mais informações sobre as permissões necessárias, consulte Concessão de acesso do Snowflake ao seu armazenamento.

Configuração de uma integração de catálogo

Para gravar em tabelas Iceberg gerenciadas externamente, você deve configurar uma integração de catálogo para conectar o Snowflake ao seu catálogo remoto.

Seu catálogo remoto deve estar em conformidade com a especificação OpenAPI REST do Apache Iceberg de código aberto, como o Open Catalog ou o catálogo do Iceberg REST do AWS Glue.

Para criar uma integração de catálogo, consulte as instruções nos seguintes tópicos:

Criar um banco de dados vinculado a catálogo

O Snowflake oferece suporte à criação de tabelas graváveis ​​gerenciadas externamente em um banco de dados vinculado a catálogo, que é um banco de dados Snowflake que você sincroniza com um catálogo REST Iceberg externo. Você também pode gravar em tabelas Iceberg que o Snowflake descobre automaticamente no seu catálogo remoto. Para obter mais informações, consulte Usar um banco de dados vinculado a catálogo para tabelas Apache Iceberg™.

Nota

Como alternativa, você pode criar tabelas Iceberg graváveis ​​gerenciadas externamente em um banco de dados Snowflake padrão.

O exemplo a seguir usa o comando CREATE DATABASE (vinculado a catálogo) para criar um banco de dados vinculado a catálogo que utiliza um volume externo:

CREATE DATABASE my_catalog_linked_db
  LINKED_CATALOG = (
    CATALOG = 'glue_rest_catalog_int'
  ),
  EXTERNAL_VOLUME = 'my_external_vol';
Copy

Use CREATE SCHEMA para criar namespaces no seu catálogo externo

Para criar um namespace para organizar tabelas Iceberg no seu catálogo externo, você pode usar o comando CREATE SCHEMA com um banco de dados vinculado a catálogo. O comando cria um namespace no seu catálogo REST Iceberg vinculado e um esquema correspondente no seu banco de dados Snowflake.

CREATE SCHEMA 'my_namespace';
Copy

Nota

Os nomes dos esquemas devem ser alfanuméricos e não podem incluir delimitadores.

DROP SCHEMA

Você também pode usar o comando DROP SCHEMA para remover simultaneamente um esquema do seu banco de dados vinculado a catálogo e o namespace correspondente do seu catálogo remoto.

DROP SCHEMA 'my_namespace';
Copy

Criação de uma tabela Iceberg

A criação de uma tabela Iceberg gerenciada externamente na qual você pode gravar a partir do Snowflake varia dependendo do tipo de banco de dados que você usa:

Criar uma tabela Iceberg em um banco de dados vinculado a catálogo

Para criar uma tabela no Snowflake e no seu catálogo externo ao mesmo tempo, use o comando CREATE ICEBERG TABLE (banco de dados vinculado a catálogo).

O exemplo a seguir cria uma tabela Iceberg gravável usando a integração de catálogo e volume externo criada anteriormente para o AWS Glue REST.

USE DATABASE my_catalog_linked_db;

USE SCHEMA my_namespace;

CREATE OR REPLACE ICEBERG TABLE my_iceberg_table (
  first_name string,
  last_name string,
  amount int,
  create_date date
)
TARGET_FILE_SIZE = '64MB';
Copy

Quando você executa o comando, o Snowflake cria uma nova tabela Iceberg no seu catálogo remoto e uma tabela vinculada, gravável e gerenciada externamente no Snowflake.

Criar uma tabela Iceberg em um banco de dados Snowflake padrão

Se estiver usando um banco de dados Snowflake padrão, primeiro crie uma tabela no seu catálogo remoto. Por exemplo, você pode usar o Spark para gravar uma tabela Iceberg no Open Catalog.

Após criar a tabela no seu catálogo remoto, use o comando CREATE ICEBERG TABLE (catálogo REST Iceberg) para criar um objeto de tabela Iceberg no Snowflake. Para CATALOG_TABLE_NAME, especifique o nome da tabela como ela aparece no seu catálogo remoto.

Por exemplo:

CREATE OR REPLACE ICEBERG TABLE my_iceberg_table
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'my_rest_catalog_integration'
  CATALOG_TABLE_NAME = 'my_remote_table_name';
Copy

Quando você executa o comando, o Snowflake cria uma tabela gravável gerenciada externamente no Snowflake, vinculada à tabela existente no seu catálogo remoto.

Remoção de uma tabela Iceberg

Você pode remover simultaneamente uma tabela Iceberg gravável gerenciada externamente do Snowflake e do seu catálogo remoto usando o comando DROP ICEBERG TABLE.

DROP ICEBERG TABLE my_iceberg_table;
Copy

O Snowflake remove a tabela e também faz uma chamada para o seu catálogo Iceberg remoto, instruindo-o a remover a tabela e excluir os dados e metadados subjacentes da tabela.

O Snowflake remove a tabela somente após confirmar que ela foi removida com sucesso do catálogo remoto.

Nota

Se você usar o catálogo de dados do AWS Glue como catálogo externo, remover uma tabela gerenciada externamente pelo Snowflake não excluirá os arquivos da tabela subjacente. Esse comportamento é específico da implementação do catálogo de dados do AWS Glue.

Gravação em tabelas Iceberg gerenciadas externamente

Você pode usar os seguintes comandos DML para tabelas Iceberg gerenciadas externamente:

Você também pode usar a Snowpark API para processar tabelas Iceberg.

Exemplos

Você pode usar os seguintes exemplos básicos para começar a escrever em tabelas Iceberg.

INSERT

Use INSERT para inserir valores em uma tabela Iceberg:

INSERT INTO my_iceberg_table VALUES (1, 'a');
INSERT INTO my_iceberg_table VALUES (2, 'b');
INSERT INTO my_iceberg_table VALUES (3, 'c');
Copy

UPDATE

Use UPDATE para atualizar os valores em uma tabela Iceberg:

UPDATE my_iceberg_table
  SET a = 10
  WHERE b = 'b';
Copy

DELETE

Use DELETE para remover valores de uma tabela Iceberg:

DELETE my_iceberg_table
  WHERE b = 'a';
Copy

MERGE

Use MERGE em uma tabela Iceberg:

MERGE INTO my_iceberg_table USING my_snowflake_table
  ON my_iceberg_table.a = my_snowflake_table.a
  WHEN MATCHED THEN
      UPDATE SET my_iceberg_table.b = my_snowflake_table.b
  WHEN NOT MATCHED THEN
      INSERT VALUES (my_snowflake_table.a, my_snowflake_table.b);
Copy

COPY INTO <table>

Use COPY INTO <tabela> para carregar dados em uma tabela Iceberg.

COPY INTO customer_iceberg_ingest
  FROM @my_parquet_stage
  FILE_FORMAT = 'my_parquet_format'
  LOAD_MODE = ADD_FILES_COPY
  PURGE = TRUE
  MATCH_BY_COLUMN_NAME = CASE_SENSITIVE;
Copy

Para obter mais informações, consulte Carregamento dados nas tabelas do Apache Iceberg™.

Captura de dados de alteração usando fluxos

Um fluxo de tabela acompanha as alterações feitas em linhas em uma tabela de origem para captura de dados de alterações (CDC). A tabela de origem pode ser uma tabela Snowflake padrão, uma tabela Iceberg gerenciada pelo Snowflake ou uma tabela Iceberg gerenciada externamente. Você pode inserir as alterações em uma tabela Iceberg gerenciada externamente usando o comando INSERT INTO… SELECT FROM….

Nota

Se a sua tabela de origem for uma tabela Iceberg gerenciada externamente, você deverá usar INSERT_ONLY = TRUE ao criar o fluxo.

CREATE OR REPLACE STREAM my_stream ON TABLE my_snowflake_table;

//...

INSERT INTO my_iceberg_table(id,name)
  SELECT id, name
  FROM my_stream;
Copy

Uso do Snowpark

Crie uma função para copiar dados de uma tabela Snowflake para uma tabela Iceberg usando o Snowpark Python.

def copy_into_iceberg():

  try:
      df = session.table("my_snowflake_table")

      df.write.save_as_table("my_iceberg_table")

  except Exception as e:
      print(f"Error processing {table_name}: {e}")
Copy

Solução de problemas

Se ocorrer um problema quando o Snowflake tentar confirmar as alterações da tabela no seu catálogo externo, o Snowflake retornará uma das seguintes mensagens de erro.

Erro

004185=SQL Execution Error: Failed while committing transaction to external catalog. Error:''{0}''

Ou:

004185=SQL Execution Error: Failed while committing transaction to external catalog with unresolvable commit conflicts. Error:''{0}''

Causa

Uma confirmação para o catálogo externo falhou, em que {0} é a exceção retornada pelo catálogo externo (se disponível); caso contrário, o Snowflake relatará Exception unavailable como causa. A mensagem de erro inclui with unresolvable commit conflicts se o Snowflake encontrou um conflito de confirmação insolúvel ao tentar confirmar uma transação no catálogo externo.

Erro

004500=SQL Execution Error: Cannot verify the status of transaction from external catalog. The statement ''{0}'' with transaction id {1} may or may not have committed to external catalog. Error:''{2}''

Causa

Uma confirmação para o catálogo externo resultou em nenhuma resposta do catálogo externo. A mensagem inclui a exceção retornada pelo catálogo externo (se disponível); caso contrário, o Snowflake relatará Exception unavailable como causa.