Gerenciar tabelas Apache Iceberg™

Gerenciar Tabelas Apache Iceberg™ no Snowflake:

Você também pode converter uma tabela Iceberg que usa um catálogo externo em uma tabela que use Snowflake como catálogo Iceberg. Para saber mais, consulte Converter uma tabela Apache Iceberg™ para usar o Snowflake como catálogo.

Consulta a uma tabela

Para consultar uma tabela Iceberg, um usuário deve receber ou herdar os seguintes privilégios:

  • O privilégio USAGE no banco de dados e no esquema com a tabela

  • O privilégio SELECT na tabela

Você pode consultar uma tabela Iceberg usando uma instrução SELECT. Por exemplo:

SELECT col1, col2 FROM my_iceberg_table;
Copy

Nota

Além do Snowflake, você também pode usar um mecanismo de consulta externo para consultar tabelas Iceberg. Para obter mais informações, consulte Uso de um mecanismo de consulta externo com tabelas Apache Iceberg™.

Usar comandos DML

As tabelas Iceberg que usam o Snowflake como catálogo oferecem suporte Comandos de linguagem de manipulação de dados (DML) completo, incluindo o seguinte:

As tabelas gerenciadas pelo Snowflake também oferecem suporte ao carregamento em massa eficiente usando recursos como COPY INTO <tabela> e Snowpipe. Para obter mais informações, consulte Carregamento dados nas tabelas do Apache Iceberg™.

Nota

Exemplo: atualizar uma tabela

Você pode usar instruções INSERT e UPDATE para modificar tabelas Iceberg gerenciadas pelo Snowflake.

O exemplo a seguir insere um novo valor em uma tabela Iceberg chamada store_sales e atualiza a coluna cola para 1 se o valor for atualmente -99.

INSERT INTO store_sales VALUES (-99);

UPDATE store_sales
  SET cola = 1
  WHERE cola = -99;
Copy

Geração de instantâneos de alterações de DML

Para tabelas que usam Snowflake como catálogo, o Snowflake gera automaticamente os metadados do Iceberg. O Snowflake grava os metadados em uma pasta chamada metadata em seu volume externo. Para localizar a pasta metadata, consulte Diretórios de dados e metadados.

Como alternativa, você pode chamar a função SYSTEM$GET_ICEBERG_TABLE_INFORMATION para gerar metadados do Iceberg para quaisquer novas alterações.

Para tabelas que não são gerenciadas pelo Snowflake, a função retorna informações sobre o instantâneo atualizado mais recente.

Por exemplo:

SELECT SYSTEM$GET_ICEBERG_TABLE_INFORMATION('db1.schema1.it1');
Copy

Saída:

+-----------------------------------------------------------------------------------------------------------+
| SYSTEM$GET_ICEBERG_TABLE_INFORMATION('DB1.SCHEMA1.IT1')                                                   |
|-----------------------------------------------------------------------------------------------------------|
| {"metadataLocation":"s3://mybucket/metadata/v1.metadata.json","status":"success"}                         |
+-----------------------------------------------------------------------------------------------------------+

Use as exclusões em nível de linha

O Snowflake oferece suporte à consulta de tabelas com exclusões em nível de linha e à gravação em tabelas usando exclusões em nível de linha.

Consultar tabelas

O Snowflake oferece suporte à consulta de tabelas Iceberg gerenciadas externamente quando você tiver configurado as exclusões em nível de linha para operações de atualização, exclusão e mesclagem.

Para configurar as exclusões em nível de linha, consulte Propriedades de gravação na documentação do Apache Iceberg.

Gravar em tabelas usando arquivos de exclusão posicional

Nota

  • Compatível apenas para tabelas Iceberg gerenciadas externamente.

  • Para usar exclusões posicionais em nível de linha, certifique-se de que a versão do Iceberg para tabelas Iceberg esteja definida como v2, que é o padrão. Para obter mais informações, consulte ICEBERG_VERSION_DEFAULT. Se a versão do Iceberg estiver definida como v3, o comportamento de mesclagem na leitura no Snowflake será utilizar vetores de exclusão.

O Snowflake oferece suporte a exclusões em nível de linha de posição para gravação em tabelas Iceberg gerenciadas externamente e armazenadas no Amazon S3, Azure ou Google Cloud. Para desativar as exclusões de posição, que permitem a execução das operações DML no modo de cópia na gravação, defina o parâmetro ENABLE_ICEBERG_MERGE_ON_READ como FALSE no nível da tabela, do esquema ou do banco de dados.

Gravar em tabelas usando vetores de exclusão

Para otimizar as modificações de dados em nível de linha, o Snowflake é compatível com vetores de exclusão para gravação em tabelas Iceberg gerenciadas externamente e gerenciadas pelo Snowflake, armazenadas no Amazon S3, Azure ou Google Cloud. Com vetores de exclusão, o Snowflake pode executar operações de «mesclagem na leitura» (merge-on-read, MOR), que melhoram o desempenho de gravação para as seguintes instruções DML:

  • DELETE

  • UPDATE

  • MERGE

O Snowflake atinge esse desempenho gravando pequenos arquivos vetoriais em vez de reescrever grandes arquivos de dados. Para obter mais informações, consulte Vetores de exclusão na especificação do Apache Iceberg.

Habilitar vetores de exclusão

Para habilitar vetores de exclusão, siga as etapas abaixo:

  1. Defina a versão padrão do Iceberg para tabelas Iceberg como v3, seguindo as instruções em Configuração da versão padrão do Iceberg.

    Nota

    Se a versão padrão do Iceberg para tabelas Iceberg for v2, o Snowflake executará operações de «mesclagem na leitura» (merge-on-read, MOR) usando arquivos de exclusão posicional.

  2. Defina o parâmetro ENABLE_ICEBERG_MERGE_ON_READ como TRUE, que é o padrão, seguindo as instruções em ENABLE_ICEBERG_MERGE_ON_READ.

  3. Para executar operações DML no modo cópia na gravação, defina o parâmetro ENABLE_ICEBERG_MERGE_ON_READ como FALSE.

Notas de uso de vetores de exclusão

  • Comportamento padrão

    • O padrão do sistema para ENABLE_ICEBERG_MERGE_ON_READ é TRUE.

  • Heurísticas do método de gravação

    • Quando ENABLE_ICEBERG_MERGE_ON_READ é definido como TRUE, o Snowflake usa heurísticas para decidir, para cada arquivo, se deve usar mesclagem na leitura ou cópia na gravação:

      • Contagem de linhas: o Snowflake só grava um vetor de exclusão se menos de ~5% das linhas em um arquivo de dados forem excluídas. Se ≥5% forem excluídas, o Snowflake reescreve o arquivo usando cópia na gravação.

      • Tamanho do arquivo: para que o Snowflake grave vetores de exclusão, o arquivo de dados deve ser maior que aproximadamente 1,6 MB.

  • Compatibilidade

    • Se você usar mecanismos de computação que ainda não são compatíveis vetores de exclusão do Iceberg v3, defina ENABLE_ICEBERG_MERGE_ON_READ como FALSE para aplicar cópia na gravação para todas as gravações.

  • Precedência de parâmetros

    • O Snowflake verifica apenas o parâmetro ENABLE_ICEBERG_MERGE_ON_READ para determinar o método de gravação. Ele não reconhece as seguintes propriedades de tabela Iceberg:

      • write.delete.mode

      • write.update.mode

      • write.merge.mode

Cópia na gravação vs. fusão na leitura

O Iceberg oferece dois modos para configurar como os mecanismos de computação lidam com operações em nível de linha para tabelas gerenciadas externamente. O Snowflake oferece suporte a esses dois modos.

A tabela a seguir descreve quando você pode querer usar cada modo:

Modo

Descrição

Cópia na gravação (padrão)

Esse modo prioriza o tempo de leitura e afeta a velocidade de gravação.

Quando você executa uma operação de atualização, exclusão ou fusão, o mecanismo de computação reescreve todo o arquivo de dados Parquet afetado. Isso pode resultar em gravações lentas, especialmente se você tiver arquivos de dados grandes, mas não afeta o tempo de leitura.

Esse é o modo padrão.

Fusão na leitura

Esse modo prioriza a velocidade de gravação e afeta ligeiramente o tempo de leitura.

Quando você executa uma operação de atualização, exclusão ou fusão, o mecanismo de computação cria um arquivo de exclusão que contém informações apenas sobre as linhas alteradas.

Quando você lê a partir de uma tabela, o mecanismo de consulta mescla os arquivos de exclusão com os arquivos de dados. A fusão pode aumentar o tempo de leitura. No entanto, você pode otimizar o desempenho da leitura programando a compactação regular e a manutenção da tabela.

Para obter mais informações sobre alterações em nível de linha no Iceberg, consulte Exclusões em nível de linha na documentação do Apache Iceberg.

Considerações e limitações

Considere as seguintes informações ao usar exclusões em nível de linha com tabelas Iceberg:

  • O Snowflake é compatível com exclusões de posição apenas para tabelas Iceberg v2 e vetores de exclusão para tabelas Iceberg v3.

  • O Snowflake é compatível com exclusões de posição apenas com tabelas Iceberg gerenciadas externamente.

  • Para obter o melhor desempenho de leitura ao usar exclusões em nível de linha, execute a compactação regular e a manutenção da tabela para remover arquivos de exclusão antigos. Para obter mais informações, consulte Manter tabelas que usam um catálogo externo.

  • Exclusões de posição excessivas, especialmente exclusões de posição pendentes, podem impedir operações de criação e atualização de tabelas. Para evitar esse problema, execute a manutenção da tabela para remover exclusões de posição extras.

    O método de manutenção de tabela a ser usado depende do seu mecanismo Iceberg externo. Por exemplo, você pode usar o método rewrite_data_files para Spark com as opções delete-file-threshold ou rewrite-all. Para obter mais informações, consulte rewrite_data_files na documentação Apache Iceberg™.

Definir um tamanho de arquivo de destino

Para melhorar o desempenho das consultas para mecanismos Iceberg externos, como Spark ou Trino, você pode configurar um tamanho de arquivo de destino para tabelas Iceberg gerenciadas pelo Snowflake e externamente com suporte para gravação. Você pode definir um tamanho específico (16MB, 32MB, 64MB ou 128MB) ou usar a opção AUTO. AUTO funciona de modo diferente, dependendo do tipo de tabela:

  • Tabelas gerenciadas pelo Snowflake: AUTO especifica que o Snowflake deve escolher o tamanho do arquivo para a tabela com base em características da tabela, como tamanho, DML padrões, carga de trabalho de ingestão e configuração de cluster. O Snowflake ajusta automaticamente o tamanho do arquivo, começando em 16 MB, para melhor desempenho de leitura e gravação no Snowflake.

  • Tabelas gerenciadas externamente: AUTO especifica que o Snowflake deve escalar agressivamente para um tamanho de arquivo maior.

Você pode definir o tamanho do arquivo de destino ao criar uma tabela Iceberg ou executar o comando ALTER ICEBERG TABLE para alterar o tamanho do arquivo de destino para uma tabela Iceberg existente. O Snowflake tenta manter os tamanhos dos arquivos próximos ao tamanho de destino ao gravar arquivos Parquet para uma tabela.

Após definir um tamanho de arquivo de destino, o Snowflake começa imediatamente a criar arquivos maiores para novas operações da linguagem de manipulação de dados (DML). As operações de manutenção de tabelas do Snowflake alteram assincronamente os arquivos de tabela existentes de acordo com o tamanho do arquivo de destino.

O exemplo a seguir usa TARGET_FILE_SIZE para definir um tamanho de arquivo de destino de 128 MB para uma tabela gerenciada pelo Snowflake:

CREATE ICEBERG TABLE my_iceberg_table (col1 INT)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  TARGET_FILE_SIZE = '128MB';
Copy

Como alternativa, use ALTER ICEBERG TABLE para definir a propriedade TARGET_FILE_SIZE para uma tabela existente:

ALTER ICEBERG TABLE my_iceberg_table
  SET TARGET_FILE_SIZE = '32MB';
Copy

Para verificar o valor da propriedade TARGET_FILE_SIZE de uma tabela, use o comando SHOW PARAMETERS:

SHOW PARAMETERS LIKE 'target_file_size' FOR my_iceberg_table;
Copy

Otimização para tabelas Iceberg gerenciadas pelo Snowflake

A otimização de tabelas realiza automaticamente a manutenção para melhorar o desempenho e reduzir os custos de armazenamento das tabelas Iceberg gerenciadas pelo Snowflake.

Nota

  • O Snowflake não oferece suporte à exclusão de arquivos órfãos de tabelas Iceberg gerenciadas pelo Snowflake. Se você observar uma incompatibilidade entre o uso do seu armazenamento em nuvem externo e do Snowflake, talvez haja arquivos órfãos no armazenamento em nuvem externo. Para ver o uso de armazenamento do Snowflake, você pode usar Exibição TABLE_STORAGE_METRICS ou Exibição TABLE_STORAGE_METRICS. Se você observar uma incompatibilidade, entre em contato com o suporte Snowflake para obter ajuda para determinar se há arquivos órfãos e removê-los.

  • Para melhorar o desempenho da consulta, você também pode definir um tamanho de arquivo de destino. Para obter mais informações, consulte Definir um tamanho de arquivo de destino.

O Snowflake oferece suporte aos recursos de otimização de tabela Iceberg resumidos a seguir:

Recurso

Melhora o desempenho da consulta

Reduz os custos de armazenamento

Notas

Clustering automático [1]

  • Faturado.

  • Desativado por padrão

Compactação de dados

  • Faturado.

  • Ativado por padrão

Compactação de manifestos

  • Sem custo.

  • Habilitado automaticamente; você não pode desativar.

Expiração de instantâneos

  • Sem custo.

  • Habilitado automaticamente; você não pode desativar.

[1] Ao contrário dos outros recursos de otimização de tabela, o clustering automático é faturado separadamente como um recurso autônomo.

Clustering automático

O clustering automático reorganiza os dados em arquivos ou partições com base nas colunas consultadas com frequência. O tamanho do arquivo para tabelas Iceberg é baseado na sua configuração de clustering, a menos que você defina um tamanho de arquivo de destino. Se fizer isso, o tamanho do arquivo será o tamanho definido por você. Para obter mais informações, consulte Definir um tamanho de arquivo de destino.

Para definir o Clustering automático, especifique o parâmetro CLUSTER BY ao criar uma tabela Iceberg gerenciada pelo Snowflake ou modificar uma tabela que já existe. Para obter mais informações, consulte:

Para mais informações sobre clustering automático, consulte Clustering automático.

Compactação de dados

A compactação de dados combina arquivos pequenos em arquivos maiores e mais eficientes. Isso ajuda a gerenciar o armazenamento, manter um tamanho de arquivo ideal e melhorar o desempenho da consulta.

Na maioria dos casos, a compactação de dados não tem um efeito significativo nos custos de computação. No entanto, se isso for uma preocupação, você pode desativar a compactação. Por exemplo, você pode querer desativar a compactação em uma tabela se raramente a consultar. Para desativar ou ativar a compactação de dados, consulte Definir compactação de dados.

Nota

  • Para consultar trabalhos de compactação de dados para tabelas Iceberg, consulte Exibição ICEBERG_STORAGE_OPTIMIZATION_HISTORY. Esta exibição inclui o número de créditos faturados para compactação de dados.

  • Se Clustering automático estiver ativado, o clustering executará a compactação de dados na tabela. Isso é válido independentemente de a compactação de dados estar ativada ou desativada na tabela.

  • Você também tem a opção de definir um tamanho de arquivo de destino. Para obter mais informações, consulte Definir um tamanho de arquivo de destino.

Compactação de manifestos

A compactação de manifestos otimiza a camada de metadados reorganizando e combinando arquivos de manifesto menores. Essa compactação reduz a sobrecarga de metadados e melhora o desempenho das consultas.

Este recurso é habilitado automaticamente e não pode ser desativado.

Expiração de instantâneos

A expiração de instantâneos exclui sistematicamente instantâneos antigos e seus dados e arquivos de metadados exclusivos do histórico da tabela. Essa exclusão é baseada em políticas de retenção predefinidas.

Este recurso é habilitado automaticamente e não pode ser desativado.

Manter tabelas que usam um catálogo externo

Você pode executar operações de manutenção em tabelas Iceberg que usam um catálogo externo.

As operações de manutenção incluem as seguintes:

  • Instantâneos expirados

  • Remoção de arquivos de metadados antigos

  • Compactação de arquivos de dados

Importante

Para manter sua tabela Iceberg sincronizada com as alterações externas, é importante alinhar seu cronograma de atualização do Snowflake com a manutenção da tabela. Atualize a tabela toda vez que você realizar uma operação de manutenção.

Para saber mais sobre a manutenção de tabelas Iceberg que não são gerenciadas pelo Snowflake, consulte Manutenção na documentação do Apache Iceberg.

Atualização dos metadados da tabela

Ao usar um catálogo Iceberg externo, você pode atualizar os metadados da tabela usando o comando ALTER ICEBERG TABLE … REFRESH. A atualização dos metadados da tabela sincroniza os metadados com as alterações mais recentes da tabela.

Nota

Recomendamos que você configure a atualização automática para tabelas gerenciadas externamente com suporte.

Atualizar os metadados de uma tabela

O exemplo a seguir atualiza manualmente os metadados de uma tabela que usa um catálogo externo (por exemplo, AWS Glue ou Delta). A atualização da tabela mantém a tabela sincronizada com quaisquer alterações ocorridas no catálogo remoto.

Com esse tipo de tabela Iceberg, você não precisa especificar um caminho de arquivo de metadados no comando.

ALTER ICEBERG TABLE my_iceberg_table REFRESH;
Copy

Para manter uma tabela atualizada automaticamente, você pode configurar a atualização automática. Use o comando ALTER ICEBERG TABLE.

Por exemplo:

ALTER ICEBERG TABLE my_iceberg_table SET AUTO_REFRESH = TRUE;
Copy

Atualizar os metadados de uma tabela criada a partir de arquivos Iceberg

O exemplo a seguir atualiza manualmente uma tabela criada a partir de arquivos de metadados Iceberg em um local de armazenamento em nuvem externo, especificando o caminho relativo para um arquivo de metadados sem a barra (/) no início. O arquivo de metadados define os dados na tabela após a atualização.

ALTER ICEBERG TABLE my_iceberg_table REFRESH 'metadata/v1.metadata.json';
Copy

Recuperar métricas de armazenamento

Snowflake não cobra de sua conta os custos de armazenamento da tabela Iceberg. No entanto, você pode acompanhar quanto armazenamento uma tabela Iceberg ocupa consultando as exibições TABLE_STORAGE_METRICS e TABLES no esquema Snowflake Information Schema ou Account Usage.

O exemplo de consulta a seguir une a exibição ACCOUNT_USAGE.TABLE_STORAGE_METRICS à exibição ACCOUNT_USAGE.TABLES, filtrando na coluna TABLES.IS_ICEBERG.

SELECT metrics.* FROM
  snowflake.account_usage.table_storage_metrics metrics
  INNER JOIN snowflake.account_usage.tables tables
  ON (
    metrics.id = tables.table_id
    AND metrics.table_schema_id = tables.table_schema_id
    AND metrics.table_catalog_id = tables.table_catalog_id
  )
  WHERE tables.is_iceberg='YES';
Copy

Definir compactação de dados

Você pode definir a compactação de dados em tabelas do Iceberg gerenciadas pelo Snowflake ao criar um banco de dados, esquema ou tabela, ou executar o comando ALTER para alterar a configuração de um banco de dados, esquema ou tabela existente. Você também pode definir a compactação de dados no nível da conta usando o comando ALTER ACCOUNT. Para obter mais informações sobre compactação de dados, consulte Compactação de dados.

O exemplo a seguir usa ENABLE_DATA_COMPACTION para desativar a compactação de dados para uma tabela gerenciada pelo Snowflake:

CREATE ICEBERG TABLE my_iceberg_table (col1 INT)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  ENABLE_DATA_COMPACTION = FALSE;
Copy

Como alternativa, use ALTER ICEBERG TABLE para desabilitá-la para uma tabela existente.

ALTER ICEBERG TABLE my_iceberg_table
  SET ENABLE_DATA_COMPACTION = FALSE;
Copy

Para obter mais informações, consulte:

Usar valores padrão com tabelas Iceberg

Nota

Para obter os outros recursos do Iceberg v3 compatíveis nesta versão preliminar, consulte Tabelas Apache Iceberg™: Suporte para Apache Iceberg™ v3 (versão preliminar).

Esta versão preliminar introduz o suporte ao recurso de valores padrão para tabelas Apache Iceberg™ de acordo com a especificação do Iceberg v3.

Importante

Para usar valores padrão com tabelas Iceberg, as tabelas devem estar em conformidade com a v3 da especificação de tabela Apache Iceberg™. Para obter instruções sobre como configurar a versão do Iceberg para tabelas, consulte Configuração da versão padrão do Iceberg.

Esse recurso permite definir valores padrão para registros existentes e novos sem precisar reescrever arquivos de dados existentes. Você pode definir os seguintes valores padrão para colunas de tabela:

  • Um padrão inicial, que fornece um valor padrão para registros existentes quando um campo é adicionado.

  • Um padrão de gravação, que fornece um valor padrão para registros novos se o campo com o valor padrão não é especificado durante as gravações.

Com esse recurso, você pode evoluir esquemas enquanto apresenta valores para dados históricos e fornece um valor de fallback para gravações futuras. Para obter mais informações, consulte Valores padrão.

Você pode especificar um valor padrão ao criar ou modificar uma tabela:

  • Para criar uma tabela com um valor padrão para uma coluna, use a palavra-chave DEFAULT com a definição da coluna. O valor especificado é definido como o padrão inicial e o padrão de gravação para a coluna. Você não pode alterar o padrão inicial da coluna.

  • Para adicionar uma coluna com um valor padrão a uma tabela, use a palavra-chave DEFAULT com a definição da coluna no comando ALTER ICEBERG TABLE. O valor especificado é definido como o padrão inicial e o padrão de gravação para a coluna. Você não pode alterar o padrão inicial da coluna.

  • Para alterar o padrão de gravação de uma coluna, use as palavras-chave WRITE DEFAULT com o comando ALTER ICEBERG TABLE.

Importante

Ao especificar um valor padrão para uma coluna, você deve especificar um valor estático; não é possível especificar uma expressão ou função para o valor. Esse requisito está de acordo com a especificação Iceberg v3 e se aplica tanto ao valor padrão inicial quanto ao padrão de gravação.

As seções a seguir incluem exemplos de como especificar valores padrão e alterar o valor de gravação padrão.

Exemplo: Criar uma tabela com um valor padrão

Para criar uma tabela Iceberg com valores padrão, use o comando CREATE ICEBERG TABLE.

No exemplo a seguir, você primeiro define um valor padrão para uma coluna ao criar uma tabela Iceberg gerenciada pelo Snowflake. Em seguida, você insere um registro na tabela sem especificar um valor para a coluna com o valor padrão.

  1. Crie uma tabela user_events, que inclui uma coluna event_version com um valor padrão de 2:

    CREATE ICEBERG TABLE user_events (
        event_id INT,
        user_id INT,
        event_type STRING,
        event_time TIMESTAMP,
        event_version INT DEFAULT 2
      )
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'my_external_volume'
      BASE_LOCATION = 'database/schema/user_event'
      ICEBERG_VERSION = 3;
    
    Copy

    A configuração de um valor padrão na definição da tabela define um padrão inicial e um padrão de gravação. Como a coluna tem um padrão de gravação, o valor 2 será utilizado para novos registros se o event_version não for especificado durante as gravações.

  2. Adicione um evento de login com event_version especificado:

    INSERT INTO user_events VALUES
      (1, 101, 'login', '2025-11-01 10:00:00', 1);
    
    Copy
  3. Adicione um evento de compra, mas não especifique um event_version:

    INSERT INTO user_events VALUES
    (1, 101, 'purchase', '2025-11-01 10:01:00');
    
    Copy

    Como resultado, o Snowflake insere o valor de event_version na tabela como 2.

  4. Consultar a tabela:

    SELECT * FROM user_events;
    
    Copy

    Saída:

    +-----------+----------+-------------+---------------------+----------------+
    | event_id  | user_id  | event_type  | event_time          | event_version  |
    +-----------+----------+-------------+---------------------+----------------+
    | 1         | 101      | login       | 2025-11-01 10:00:00 | 1              |
    | 1         | 101      | purchase    | 2025-11-01 10:01:00 | 2              |
    +-----------+----------+-------------+---------------------+----------------+
    

Exemplo: Adicionar uma coluna com um valor padrão a uma tabela existente

Para adicionar uma nova coluna com um valor padrão a uma tabela Iceberg, use o comando ALTER ICEBERG TABLE.

No exemplo a seguir, você modifica a tabela user_events adicionando uma coluna event_version, que tem um valor padrão de 2:

ALTER ICEBERG TABLE user_events ADD COLUMN event_version INT DEFAULT 2;
Copy

Além de definir um padrão de gravação, adicionar uma coluna com um valor padrão também define um padrão inicial para a coluna. Como resultado, o valor padrão para registros existentes na coluna event_version é 2.

Exemplo: Alterar o padrão de gravação de uma coluna

O exemplo a seguir altera o padrão de gravação da coluna event_version da tabela user_events para 3:

ALTER ICEBERG TABLE user_events ALTER COLUMN event_version SET WRITE DEFAULT 3;
Copy

Visualizar os valores padrão definidos para uma tabela

Para visualizar o valor padrão de uma coluna de tabela em uma tabela Iceberg gerenciada pelo Snowflake ou gerenciada externamente, execute o comando DESCRIBE ICEBERG TABLE e, em seguida, visualize as colunas DEFAULT e WRITE DEFAULT na saída:

  • A coluna DEFAULT corresponde ao valor initial-default na especificação Apache Iceberg.

  • A coluna WRITE DEFAULT corresponde ao valor write-default na especificação Apache Iceberg.

Essas colunas retornam na saída, independentemente de a tabela ser Iceberg v2 ou Iceberg v3.

O exemplo a seguir descreve as colunas da tabela user_events. Esta tabela tem um padrão inicial e um padrão de gravação especificados para a coluna event_version:

DESC ICEBERG TABLE user_events
  ->> SELECT
    "name",
    "kind",
    "default",
    "write default"
      FROM $1;
Copy

Saída:

+-----------------+---------+---------+---------------+
| name            | kind    | default | write default |
+-----------------+---------+-------------------------+
| EVENT_ID        | COLUMN  |         |               |
| USER_ID         | COLUMN  |         |               |
| EVENT_TYPE      | COLUMN  |         |               |
| EVENT_TIME      | COLUMN  |         |               |
| EVENT_VERSION   | COLUMN  | 2       | 3             |
+-----------------+---------+---------+---------------+

Descartar o padrão de gravação

Para descartar o padrão de gravação de uma coluna, use as palavras-chave DROP WRITE DEFAULT com o comando ALTER ICEBERG TABLE.

O exemplo a seguir descarta o valor de gravação padrão da coluna event_version:

ALTER ICEBERG TABLE user_events ALTER COLUMN event_version DROP WRITE DEFAULT;
Copy

Considerações e limitações para valores padrão

Considere os seguintes itens ao usar valores padrão com tabelas Iceberg gerenciadas pelo Snowflake e gerenciadas externamente:

Tabelas Iceberg gerenciadas pelo Snowflake e gerenciadas externamente

  • Você não pode adicionar ou alterar um padrão inicial para uma coluna depois de criá-la. Portanto, você precisa descartar a coluna e adicioná-la usando os comandos ALTER TABLE … DROP COLUMN e ALTER TABLE … ADD COLUMN.

  • O tamanho máximo para um valor padrão é 128|~|MB.

  • Valores padrão não podem usar tipos de dados que não podem ser representados como constantes; portanto, você não pode usar os seguintes tipos de dados com um valor padrão:

    • map

    • lista

    • struct

    • variant

Tabelas Iceberg gerenciadas pelo Snowflake

  • O valor write-default é sempre inicializado com o valor initial-default. Para ver o padrão para ambos os valores, execute o comando DESCRIBE ICEBERG TABLE e visualize as colunas WRITE DEFAULT e DEFAULT na saída.

  • Você não pode especificar um valor padrão que use o tipo de dados TIMESTAMP_NTZ(9) ou TIMESTAMP_LTZ(9).

  • Você só pode definir um valor padrão para uma expressão, como DEFAULT pi(), ao criar uma tabela; você não pode definir um valor padrão para uma expressão ao modificar uma tabela usando o comando ALTER ICEBERG TABLE.

  • As sequências não são compatíveis.

    Por exemplo, o seguinte comando CREATE ICEBERG TABLE falha porque inclui LOG_ID NUMBER(38,0) NOT NULL autoincrement order:

    CREATE OR REPLACE ICEBERG TABLE CDC_RUN_LOG (
        LOG_ID NUMBER(38,0) NOT NULL autoincrement order,
        ENTITY_NAME VARCHAR(100),
        LAST_RUN TIMESTAMP_NTZ(9),
        DAG_NAME VARCHAR(100)
        )
        CATALOG = 'SNOWFLAKE'
        EXTERNAL_VOLUME = 'my_external_volume'
        BASE_LOCATION = 'my_iceberg_table';
        COMMENT='CDC table to manage log of runs'
        ICEBERG_VERSION = 3;
    
    Copy

Tabelas Iceberg gerenciadas externamente

  • Você não pode especificar um valor padrão que use o tipo de dados TIMESTAMP_NTZ(9) ou TIMESTAMP_LTZ(9).

Essas considerações e limitações se aplicam aos valores padrão, que são recursos do Iceberg v3. Para obter uma lista de considerações e limitações que se aplicam a todas as tabelas Iceberg v3, consulte Considerações e limitações para recursos do Iceberg v3.

Usar linhagem de linha com tabelas Iceberg

Nota

Para obter os outros recursos do Iceberg v3 compatíveis nesta versão preliminar, consulte Tabelas Apache Iceberg™: Suporte para Apache Iceberg™ v3 (versão preliminar).

Esta versão preliminar introduz compatibilidade com o recurso de linhagem de linha para tabelas Apache Iceberg™. Com esse recurso, as seguintes colunas são gravadas automaticamente pelo Snowflake em uma tabela Iceberg:

  • _row_id

  • _last_updated_sequence_number

Esse recurso permite que os mecanismos de consulta correspondam de forma confiável à mesma linha em instantâneos e detectem alterações no nível da linha. Para obter mais informações, consulte Linhagem de linhas.

Esse recurso é compatível com tabelas Iceberg gerenciadas pelo Snowflake e com tabelas gerenciadas externamente.

Importante

Para usar a linhagem de linhas com tabelas Iceberg, as tabelas devem estar em conformidade com a v3 da especificação de tabela Apache Iceberg™. Para obter instruções sobre como configurar a versão do Iceberg para tabelas, consulte Configuração da versão padrão do Iceberg.

Considerações e limitações para linhagem de linhas

A linhagem de linhas é compatível com fluxos, considerando o seguinte:

  • Fluxos apenas de acréscimo e fluxos padrão são compatíveis com as tabelas Iceberg v3 gerenciadas pelo Snowflake.

  • Fluxos apenas de inserção e fluxos padrão são compatíveis com tabelas Iceberg v3 gerenciadas externamente.

    • Para que os fluxos padrão produzam os resultados corretos, o mecanismo externo deve gravar nas tabelas Iceberg v3 em relação à especificação Iceberg v3. Especificamente, as linhas recém-inseridas devem ter _row_id=NULL. As linhas copiadas durante a cópia na gravação devem manter o endereço _row_id.

    • MAX_DATA_EXTENSION_TIME_IN_DAYS não funciona em tabelas Iceberg v3 gerenciadas externamente.

  • Quando os DMLs são confirmados em transações com várias instruções, os fluxos apenas para acréscimo nas tabelas Iceberg v3 têm semânticas diferentes em comparação com as tabelas Iceberg v2:

    • No Iceberg v2, para fluxos apenas para acréscimo, se uma linha for adicionada e depois excluída em uma transação com várias instruções, essa linha será considerada uma inserção.

    • No Iceberg v3, para fluxos apenas para acréscimo, essa linha não é tratada como uma inserção.

Essas considerações e limitações se aplicam à linhagem de linhas, que é um recurso do Iceberg v3. Para obter uma lista de considerações e limitações que se aplicam a todas as tabelas Iceberg v3, consulte Considerações e limitações para recursos do Iceberg v3.