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

Usar comandos DML com tabelas gerenciadas pelo Snowflake

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:

Nota

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™.

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

Nota

Compatível apenas para tabelas Iceberg gerenciadas externamente.

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.

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 o seguinte ao usar exclusões em nível de linha com tabelas Iceberg gerenciadas externamente:

  • O Snowflake apenas oferece suporte à exclusão por posição.

  • 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.

  • Atualmente, os recursos a seguir não são compatíveis quando você usa exclusões em nível de linha:

    • Atualização automatizada

    • Criação de exibições materializadas, otimização de pesquisa ou fluxos em tabelas dinâmicas, tabelas Iceberg dinâmicas ou tabelas Iceberg com exclusões de posição existentes.

    • Tabelas dinâmicas

    • Atualização do instantâneo Iceberg com exclusões de posição em tabelas dinâmicas, tabelas dinâmicas Iceberg ou tabelas Iceberg com exibições materializadas ativas ou excluídas, otimização de pesquisa ou fluxos.

    • Otimização de pesquisa

    • Fluxos

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