Tabelas Apache Iceberg™: Suporte para Apache Iceberg™ v3 (versão preliminar)

Esta versão preliminar introduz suporte para v3 da especificação Apache Iceberg™, mas com algumas considerações e limitações. Salvo indicação em contrário, tanto as tabelas Iceberg gerenciadas pelo Snowflake quanto as gerenciadas externamente são suportadas nesta versão preliminar.

Recursos Iceberg v3 compatíveis

Esta seção lista os recursos do Iceberg v3 que são compatíveis nesta versão preliminar.

Tipos de dados

Os seguintes tipos de dados v3 são compatíveis com a versão preliminar pública:

  • geography

  • geometry

  • nanosecond

  • variant

Para obter mais informações, consulte Tipos de dados do Iceberg v3.

Valores padrão

Consulte Valores padrão.

Vetores de exclusão

Consulte Vetores de exclusão.

Linhagem de linhas

Consulte Linhagem de linhas.

Configuração da versão padrão do Iceberg

As tabelas Iceberg têm inerentemente uma versão de formato com a qual estão em conformidade. Para tabelas Iceberg gerenciadas externamente em um banco de dados Snowflake padrão, o Snowflake recupera essa versão dos metadados da tabela.

Para as seguintes tabelas Iceberg, o proprietário da tabela deve especificar com qual versão Iceberg a tabela deve estar em conformidade:

A versão do formato Iceberg padrão do sistema no Snowflake é v2, mas você pode defini-la para v3, se necessário. Para definir a versão do Iceberg como v3, execute uma das seguintes ações:

  • Use o parâmetro ICEBERG_VERSION_DEFAULT para definir a versão Iceberg como 3 no nível da conta, do banco de dados ou do esquema. Para obter mais informações, consulte ICEBERG_VERSION_DEFAULT.

  • Especifique ICEBERG_VERSION = 3 em sua instrução CREATE ICEBERG TABLE.

    Nota

    Se você não especificar uma versão Iceberg ao criar uma tabela Iceberg, a tabela assumirá como padrão a versão Iceberg definida para o esquema, banco de dados ou conta. O esquema tem precedência sobre o banco de dados e o banco de dados tem precedência sobre a conta.

Cuidado

Antes de usar outros mecanismos para atualizar a versão de formato de uma tabela Iceberg nas propriedades da tabela para a v3, certifique-se de que a tabela não esteja sendo utilizada por mecanismos ou aplicativos que ainda não são compatíveis com a v3. O downgrade de versões de formato não é compatível com a especificação Apache Iceberg. Portanto, todos os leitores e gravadores devem ser compatíveis com a v3. A versão padrão para tabelas Iceberg no Snowflake é a v2, que pode ser configurada para a v3, se necessário. No momento, não é possível usar o Snowflake para realizar atualizações de versão no local.

Notas de uso

  • Para modificar o parâmetro ICEBERG_VERSION_DEFAULT no nível da conta, você deve ser um administrador de conta; ou seja, você deve ser um usuário com a função ACCOUNTADMIN.

  • Para modificar o parâmetro ICEBERG_VERSION_DEFAULT no nível do banco de dados ou do esquema, a função usada para executar a operação deve ter o privilégio OWNERSHIP no respectivo banco de dados ou esquema.

Exemplos

Especifique que as novas tabelas Iceberg no banco de dados my_db devem ser criadas usando v3:

ALTER DATABASE my_db SET ICEBERG_VERSION_DEFAULT=3;
Copy

Crie uma nova tabela Iceberg gerenciada externamente com v3. As definições de coluna incluídas no comando indicam que uma nova tabela será criada ou uma tabela existente será substituída no catálogo remoto. A tabela é criada com sucesso porque é uma tabela nova que não tem uma versão existente.

CREATE OR REPLACE ICEBERG TABLE my_iceberg_v3_table (
    boolean_col boolean,
    int_col int,
    long_col long,
  )
  CATALOG='my_catalog_integration'
  ICEBERG_VERSION=3;
Copy

Crie uma tabela Iceberg gerenciada externamente com v3 a partir de uma tabela existente com metadados Iceberg. A falta de uma definição de coluna ou versão de formato neste exemplo indica que esta tabela já existe e a especificação da coluna e a versão de formato serão inferidas a partir dos metadados Iceberg do catálogo remoto. Este exemplo usa credenciais fornecidas pelo catálogo, então o parâmetro EXTERNAL_VOLUME está excluído da instrução CREATE ICEBERG TABLE:

CREATE OR REPLACE ICEBERG TABLE my_iceberg_v3_table
  CATALOG = 'my_catalog_integration'
  CATALOG_TABLE_NAME = 'my_table'
  AUTO_REFRESH = TRUE;
Copy

Nota

Você não pode usar o comando ALTER ICEBERG TABLE para alterar a versão de formato de uma tabela existente.

Obter a versão de formato para tabelas Iceberg

  • O exemplo a seguir mostra como obter a versão Iceberg para uma tabela específica:

    SHOW PARAMETERS LIKE 'ICEBERG_VERSION' IN TABLE my_v3_iceberg_table;
    
    Copy

    Saída:

    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    | key             | value | default | level | description                                       | type   |
    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    | ICEBERG_VERSION | 3     | 2       | TABLE | Specifies the Iceberg table format version to ... | NUMBER |
    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    
  • O exemplo a seguir mostra como obter a versão Iceberg para uma tabela específica usando a função GET_DDL para recuperar a definição da tabela Iceberg:

    SELECT GET_DDL('ICEBERG_TABLE', 'my_v3_iceberg_table');
    
    Copy

    Saída:

     CREATE ICEBERG TABLE my_v3_iceberg_table (
      record VARIANT,
      event_timestamp TIMESTAMP_LTZ(6)
    )
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'my_external_volume'
      BASE_LOCATION = 'my_iceberg_table'
      ICEBERG_VERSION = 3;
    

Considerações e limitações para recursos do Iceberg v3

Considere as seguintes informações ao usar os recursos do Iceberg v3:

Recursos do Snowflake não compatíveis

Os seguintes recursos do Snowflake não são compatíveis nesta versão preliminar do Iceberg v3:

  • Fluxos apenas para anexação em tabelas Iceberg gerenciadas externamente

  • Projetos dbt no Snowflake

  • Inferência de esquema

  • Snowpipe Streaming classic architecture

  • Regiões SnowGov

  • Para tabelas que usam um catálogo externo, não é possível criar tabelas Iceberg v3 com colunas de tipo estruturado, que incluam OBJECT, ARRAY ou MAP. Por exemplo, você não pode usar CREATE ICEBERG TABLE … AS SELECT (CTAS) para criar uma tabela Iceberg v3 gerenciada externamente com colunas de tipo estruturado.

    É possível criar tabelas Iceberg v3 gerenciadas pelo Snowflake com colunas de tipo estruturado.

  • Uma atualização no local de uma tabela Iceberg gerenciada pelo Snowflake da v2 para a v3, que inclui clonagem de uma tabela v2 e depois a atualização do clone para a v3

    Importante

    Se você usar o Apache Spark para atualizar uma tabela Iceberg gerenciada externamente da v2 para a v3, deverá usar uma confirmação que crie um novo instantâneo, como operações DML. Caso contrário, se a versão do formato for atualizada nas propriedades da tabela sem um novo instantâneo, a atualização manual e automatizada do Snowflake para a tabela falhará até que um novo instantâneo seja criado.

    O exemplo a seguir usa o Apache Spark para atualizar uma tabela Iceberg gerenciada externamente da v2 para a v3:

    ALTER TABLE table_name SET TBLPROPERTIES('format-version'='3');
    
    Copy

Nota

  • A lista de recursos sem suporte não está finalizada e está sujeita a alterações no futuro. A lista será atualizada, conforme necessário, para refletir os recursos mais recentes sem suporte.

  • Para considerações e limitações específicas de um recurso v3, consulte o tópico do recurso de um recurso.

Recursos do Snowflake compatíveis

Recursos que não estão listados na seção Recursos do Snowflake não compatíveis são compatíveis. Os recursos compatíveis incluem aqueles na lista a seguir:

Recurso

Notas

Preenchimento automático de listagens

Atualização automática

Integrações de catálogo

Bancos de dados vinculados a catálogo

Clonagem

Clustering

Somente Iceberg v3 gerenciada pelo Snowflake.

Conversão de tabelas v3 gerenciadas externamente em gerenciadas pelo Snowflake

Compatível com as seguintes considerações:

  • O particionamento Iceberg permanece intacto quando você converte uma tabela Iceberg v3.

  • Antes da conversão, o Snowflake nunca exclui nenhum metadado, lista de manifesto ou manifesto do seu armazenamento externo.

  • Durante a conversão, o Snowflake não reescreve nenhum metadado ou arquivo de dados Parquet.

  • Após a conversão, o Snowflake é o catálogo totalmente responsável pelo gerenciamento do ciclo de vida da tabela. O Snowflake exclui metadados, listas de manifestos, manifestos e arquivos de dados, criados antes ou depois da conversão do seu armazenamento externo depois que eles expiram e passam pela janela de retenção.

COPY INTO <tabela>

LOAD_MODE = FULL_INGEST ou ADD_FILES COPY são aceitas com as seguintes considerações:

  • Para carregar as colunas de metadados da linhagem de linhas em arquivos Parquet (_row_id e _last_updated_sequence_number), você deve usar a opção FULL_INGEST. Os outros métodos LOAD_MODE não são compatíveis. No entanto, os arquivos Parquet que contêm a linhagem de linhas provavelmente já fazem parte de uma tabela Iceberg v3. Registro de arquivos Parquet usando ADD_FILES_COPY não é recomendado se esses arquivos já fizerem parte de outra tabela Iceberg. A prática recomendada para converter tabelas Iceberg gerenciadas externamente em tabelas Iceberg gerenciadas pelo Snowflake sem reescrever arquivos é usar o comando ALTER ICEBERG TABLE … CONVERT TO MANAGED.

COPY INTO <local>

Compatível com as seguintes limitações:

  • VARIANT, GEOMETRY e GEOGRAPHY são descarregados como strings codificadas com JSON.

  • TIMESTAMP_NTZ(9) é descarregado como milissegundos, não em nanossegundos.

  • TIMESTAMP_LTZ(9), ARRAY, OBJECT e MAP devem ser convertidos em outros tipos de dados.

Data Clean Rooms

Linhagem de dados

Políticas de proteção de dados

As seguintes políticas de proteção de dados são compatíveis:

  • Políticas de mascaramento

  • Políticas de acesso a linhas

  • Políticas de projeção

  • Políticas de agregação

  • Políticas de privacidade

  • Políticas de junção

Aplicação da política de proteção de dados do Apache Spark

Monitoramento da qualidade dos dados

Tabelas dinâmicas

Gravar uma tabela Iceberg gerenciada externamente v3 como destino de uma tabela dinâmica.

API REST Catalog do Horizon Iceberg

LOB (Large Object)

Exibições materializadas

Marcação de objetos

Aceleração de consulta

Replication

Otimização de pesquisa

Exibições seguras

Classificação de dados confidenciais

Tamanho do arquivo de destino

Particionamento Iceberg de argumento único

As tabelas particionadas também não podem gravar vetores de exclusão; somente cópia na gravação é compatível com tabelas particionadas.

Conector Snowflake para Kafka

Versões 4.0 ou mais recentes.

Snowpark

1.33.0 ou mais recente.

Método de API do Snowpark pandas to_iceberg

Compatível apenas com Iceberg v3 quando ICEBERG_VERSION_DEFAULT é definido na conta, banco de dados ou esquema. Se ICEBERG_VERSION = 3 é definido no nível da tabela, o método da API Snowpark pandas to_iceberg não é compatível.

Snowpark Connect para Apache Spark

Há suporte para a gravação de dataframes em tabelas Iceberg v3 existentes usando um método de anexação ou substituição. Não há suporte para a criação de uma nova tabela Iceberg v3.

Snowpipe

Snowpipe Streaming high-performance architecture

Compartilhamento

Fluxos

  • Fluxos apenas de anexação 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-inserida 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 de anexação nas tabelas Iceberg v3 têm semânticas diferentes em comparação com as tabelas Iceberg v2:

    • No Iceberg v2, para fluxos apenas para anexação, 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 anexação, essa linha não é tratada como uma inserção.

Otimização de tabelas

Recursos do Iceberg v3 não compatíveis

Os seguintes recursos da especificação Iceberg v3 não são compatíveis:

  • Variante aninhada

  • Transformações com vários argumentos para particionamento e classificação

  • Chaves de criptografia de tabela

  • Tipo de dados UNKNOWN

Exemplos: Suporte para v3 com recursos Snowflake existentes

Esta seção lista exemplos de recursos existentes do Snowflake que são compatíveis com a v3. Uma listagem de recursos inclui um exemplo para uma tabela gerenciada pelo Snowflake e uma tabela gerenciada externamente, quando compatível.

Para obter a lista completa de recursos do Snowflake que são suportados nesta versão preliminar do Iceberg v3, consulte Recursos do Snowflake compatíveis.

Criar uma tabela Iceberg v3

O exemplo a seguir cria uma tabela Apache Iceberg™ gerenciada pelo Snowflake em conformidade com a v3 da especificação Apache Iceberg™.

CREATE ICEBERG TABLE my_v3_iceberg_table (
  record VARIANT,
  event_timestamp TIMESTAMP_LTZ(6)
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  ICEBERG_VERSION = 3;
Copy

O exemplo a seguir cria uma tabela Apache Iceberg™ que usa um catálogo Iceberg REST remoto e está em conformidade com a v3 da especificação Apache Iceberg™:

Nota

Você não precisa especificar ICEBERG_VERSION = 3 com o comando porque a versão do formato já está definida nos metadados do catálogo externo; portanto, o Snowflake recupera essa versão dos metadados.

CREATE ICEBERG TABLE my_v3_iceberg_table
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'my_rest_catalog_integration'
  CATALOG_TABLE_NAME = 'my_remote_table'
  AUTO_REFRESH = TRUE;
Copy

O exemplo a seguir cria uma tabela Iceberg gravável em um banco de dados vinculado a catálogo com definições de coluna e está em conformidade com a v3 da especificação Apache Iceberg™:

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
)
  ICEBERG_VERSION = 3;
Copy

Gravar em uma tabela Iceberg v3

Os comandos do DML INSERT, UPDATE, DELETE, MERGE, TRUNCATE TABLE e COPY INTO são compatíveis com a gravação em tabelas Iceberg v3 gerenciadas pelo Snowflake e gerenciadas externamente:

O exemplo a seguir insere uma linha em uma tabela Apache Iceberg™ que está em conformidade com a v3 da especificação da tabela Apache Iceberg™:

INSERT INTO my_v3_iceberg_table (id, payload) VALUES (1, PARSE_JSON('{"name": "Alice", "age": 30}'));
Copy

O exemplo a seguir carrega arquivos em uma tabela Apache Iceberg™ que está em conformidade com a v3 da especificação de tabela Apache Iceberg™:

COPY INTO my_v3_iceberg_table
  FROM @my_json_stage
  FILE_FORMAT = 'my_json_format'
  MATCH_BY_COLUMN_NAME = CASE_SENSITIVE;
Copy

Carregar dados usando o Snowpipe

O exemplo a seguir carrega dados de arquivos para tabelas Iceberg v3, para tabelas gerenciadas pelo Snowflake e gerenciadas externamente:

CREATE PIPE mypipe
  AUTO_INGEST = TRUE
  INTEGRATION = 'MYINT'
  AS
  COPY INTO snowpipe_db.public.my_v3_iceberg_table
  FROM @snowpipe_db.public.mystage
  FILE_FORMAT = (TYPE = 'JSON');
Copy

Nota

O Snowflake oferece suporte a recursos adicionais de gravação para o Iceberg v3. Consulte essa lista em Considerações e limitações para os recursos do Iceberg v3, e depois consulte a lista de recursos compatíveis do Snowflake.

Criar uma tabela Iceberg dinâmica v3

O exemplo a seguir grava uma tabela Iceberg v3 gerenciada pelo Snowflake como a saída de uma tabela dinâmica:

CREATE DYNAMIC ICEBERG TABLE my_dynamic_iceberg_v3_table (
    num_orders NUMBER(10,0),
    order_day
  )
  TARGET_LAG = '20 minutes'
  WAREHOUSE = my_warehouse
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'SNOWFLAKE'
  BASE_LOCATION = 'my_dynamic_iceberg_v3_table'
  ICEBERG_VERSION = 3
  AS
    SELECT
        COUNT(DISTINCT order_id)
        DATE_TRUNC('DAY', order_timestamp_ns) AS order_day
      FROM staging_v3_iceberg_table;
Copy

Nota

Não há suporte para gravar uma tabela Iceberg v2 ou v3 gerenciada externamente como destino de uma tabela dinâmica. A saída de uma tabela Iceberg dinâmica só pode ser gerenciada pelo Snowflake.

Consultar uma tabela Iceberg v3

O exemplo a seguir consulta uma tabela Iceberg v3 gerenciada pelo Snowflake ou gerenciada externamente:

SELECT * FROM MY_DB.MY_SCHEMA.MY_ICEBERG_V3_TABLE;
Copy