Pular para o conteúdo principal
Fornece uma interface do tipo tabela, somente leitura, para tabelas Apache Iceberg no Amazon S3, Azure, HDFS ou armazenadas localmente.

Sintaxe

Argumentos

A descrição dos argumentos é a mesma que a dos argumentos nas funções de tabela s3, azureBlobStorage, HDFS e file, respectivamente. format representa o formato dos arquivos de dados na tabela Iceberg. Para icebergS3, é possível usar um parâmetro opcional extra_credentials para passar um role_arn para controle de acesso baseado em função no ClickHouse Cloud. Consulte Secure S3 para ver as etapas de configuração.

Valor retornado

Uma tabela com a estrutura especificada para ler dados da tabela Iceberg especificada.

Exemplo

Atualmente, o ClickHouse oferece suporte à leitura das versões v1 e v2 do formato Iceberg por meio das funções de tabela icebergS3, icebergAzure, icebergHDFS e icebergLocal e dos motores de tabela IcebergS3, icebergAzure, IcebergHDFS e IcebergLocal.

Definindo uma coleção nomeada

Veja um exemplo de configuração de uma coleção nomeada para armazenar a URL e as credenciais:

Usando um catálogo de dados

As tabelas Iceberg também podem ser usadas com vários catálogos de dados, como o REST Catalog, o AWS Glue Data Catalog e o Unity Catalog.
Ao usar um catálogo, a maioria dos usuários vai querer usar a database engine DataLakeCatalog, que conecta o ClickHouse ao seu catálogo para descobrir suas tabelas. Você pode usar essa database engine em vez de criar manualmente tabelas individuais com o motor de tabela IcebergS3.
Para usá-los, crie uma tabela com o engine IcebergS3 e forneça as configurações necessárias. Por exemplo, usando o REST Catalog com armazenamento MinIO:
Ou, usando o AWS Glue Data Catalog com S3:

Evolução de esquema

Atualmente, com o CH, é possível ler tabelas Iceberg cujo esquema mudou ao longo do tempo. No momento, oferecemos suporte à leitura de tabelas em que colunas foram adicionadas e removidas, e cuja ordem foi alterada. Também é possível alterar uma coluna em que um valor é obrigatório para outra em que NULL é permitido. Além disso, oferecemos suporte a conversões de tipo permitidas para tipos simples, a saber:  
  • int -> long
  • float -> double
  • decimal(P, S) -> decimal(P’, S), em que P’ > P.
Atualmente, não é possível alterar estruturas aninhadas nem os tipos dos elementos dentro de arrays e maps.

Poda de partições

O ClickHouse oferece suporte à poda de partições durante consultas SELECT em tabelas Iceberg, o que ajuda a otimizar o desempenho das consultas ao ignorar arquivos de dados irrelevantes. Para ativar a poda de partições, defina use_iceberg_partition_pruning = 1. Para mais informações sobre partition pruning no Iceberg, acesse https://iceberg.apache.org/spec/#partitioning

Viagem no tempo

O ClickHouse oferece suporte ao recurso de viagem no tempo em tabelas Iceberg, permitindo consultar dados históricos com um timestamp específico ou um ID de snapshot.

Processamento de tabelas com linhas excluídas

Atualmente, apenas tabelas Iceberg com exclusões por posição são suportadas. Os seguintes métodos de exclusão não são suportados:

Uso básico

Observação: não é possível especificar os parâmetros iceberg_timestamp_ms e iceberg_snapshot_id na mesma consulta.

Considerações importantes

  • Snapshots normalmente são criados quando:
  • Novos dados são gravados na tabela
  • Algum tipo de compactação de dados é executado
  • Alterações de esquema normalmente não criam snapshots - Isso leva a comportamentos importantes ao usar viagem no tempo com tabelas que passaram por evolução de esquema.

Cenários de exemplo

Todos os cenários usam Spark, porque o CH ainda não oferece suporte à gravação em tabelas Iceberg.

Cenário 1: Alterações no esquema sem novos snapshots

Considere esta sequência de operações:
Resultados da consulta em diferentes timestamps:
  • Em ts1 & ts2: aparecem apenas as duas colunas originais
  • Em ts3: aparecem as três colunas, com NULL no preço da primeira linha

Cenário 2: Diferenças entre o esquema histórico e o atual

Uma consulta de viagem no tempo no momento atual pode mostrar um esquema diferente do da tabela atual:
Isso acontece porque ALTER TABLE não cria um novo snapshot; para a tabela atual, o Spark obtém o valor de schema_id do arquivo de metadados mais recente, e não de um snapshot.

Cenário 3: Diferenças entre o esquema histórico e o atual

A segunda é que, ao usar viagem no tempo, você não consegue obter o estado da tabela antes de qualquer dado ter sido gravado nela:
No ClickHouse, o comportamento é consistente com o do Spark. Você pode imaginar as consultas Select do Spark substituídas por consultas Select do ClickHouse, e isso funcionará da mesma forma.

Resolução do arquivo de metadados

Ao usar a função de tabela iceberg no ClickHouse, o sistema precisa localizar o arquivo metadata.json correto que descreve a estrutura da tabela Iceberg. Veja como esse processo funciona:
  1. Especificação direta do caminho: *Se você definir iceberg_metadata_file_path, o sistema usará exatamente esse caminho, combinando-o com o caminho do diretório da tabela Iceberg.
  • Quando essa configuração é fornecida, todas as outras configurações de resolução são ignoradas.
  1. Correspondência do UUID da tabela: *Se iceberg_metadata_table_uuid for especificado, o sistema irá: *Considerar apenas os arquivos .metadata.json no diretório metadata *Filtrar os arquivos que contêm um campo table-uuid correspondente ao UUID especificado (sem diferenciar maiúsculas de minúsculas)
  2. Busca padrão: *Se nenhuma das configurações acima for fornecida, todos os arquivos .metadata.json no diretório metadata passam a ser candidatos

Selecionando o arquivo mais recente

Após identificar os arquivos candidatos usando as regras acima, o sistema determina qual deles é o mais recente:
  • Se iceberg_recent_metadata_file_by_last_updated_ms_field estiver habilitado:
  • O arquivo com o maior valor de last-updated-ms é selecionado
  • Caso contrário:
  • O arquivo com o número de versão mais alto é selecionado
  • (A versão aparece como V em nomes de arquivo no formato V.metadata.json ou V-uuid.metadata.json)
Observação: Todas as configurações mencionadas são configurações de função de tabela (não configurações globais nem configurações no nível da consulta) e devem ser especificadas como mostrado abaixo:
Observação: Embora os catálogos Iceberg normalmente cuidem da resolução de metadados, a função de tabela iceberg no ClickHouse interpreta diretamente arquivos armazenados no S3 como tabelas Iceberg, por isso é importante entender essas regras de resolução.

Cache de metadados

O motor de tabela Iceberg e a função de tabela oferecem suporte a um cache de metadados que armazena informações dos arquivos de manifesto, da lista de manifestos e do JSON de metadados. O cache é armazenado na memória. Esse recurso é controlado pela configuração use_iceberg_metadata_files_cache, que vem habilitada por padrão.

Aliases

A função de tabela iceberg agora é um alias para icebergS3.

Colunas virtuais

  • _path — Caminho do arquivo. Tipo: LowCardinality(String).
  • _file — Nome do arquivo. Tipo: LowCardinality(String).
  • _size — Tamanho do arquivo em bytes. Tipo: Nullable(UInt64). Se o tamanho do arquivo for desconhecido, o valor será NULL.
  • _time — Data e hora da última modificação do arquivo. Tipo: Nullable(DateTime). Se esse horário for desconhecido, o valor será NULL.
  • _etag — O etag do arquivo. Tipo: LowCardinality(String). Se o etag for desconhecido, o valor será NULL.

Gravações em tabelas Iceberg

A partir da versão 25.7, o ClickHouse oferece suporte a modificações nas tabelas Iceberg do usuário. No momento, este é um recurso experimental, então primeiro você precisa ativá-lo:

Criando tabela

Para criar sua própria tabela Iceberg vazia, use os mesmos comandos da leitura, mas especifique o esquema explicitamente. As operações de escrita oferecem suporte a todos os formatos de dados da especificação Iceberg, como Parquet, Avro e ORC.

Exemplo

Observação: para criar um arquivo indicador de versão, ative a configuração iceberg_use_version_hint. Se quiser comprimir o arquivo metadata.json, especifique o nome do codec na configuração iceberg_metadata_compression_method.

INSERT

Após criar uma nova tabela, você pode inserir dados usando a sintaxe padrão do ClickHouse.

Exemplo

DELETE

A exclusão de linhas excedentes no formato merge-on-read também é compatível com o ClickHouse. Esta consulta criará um novo snapshot com arquivos de exclusão por posição.

Exemplo

Evolução do esquema

O ClickHouse permite adicionar, remover, modificar ou renomear colunas com tipos simples (que não sejam Tuple, Array nem Map).

Exemplo

Compactação

O ClickHouse oferece suporte à compactação de tabelas Iceberg. Atualmente, ele pode mesclar arquivos de exclusão por posição aos arquivos de dados enquanto atualiza os metadados. Os IDs de snapshots anteriores e seus timestamps permanecem inalterados, portanto o recurso de viagem no tempo ainda pode ser usado com os mesmos valores. Como usá-lo:

Expirar snapshots

As tabelas Iceberg acumulam snapshots a cada operação INSERT, DELETE ou UPDATE. Com o tempo, isso pode resultar em um grande número de snapshots e arquivos de dados associados. O comando expire_snapshots remove snapshots antigos e limpa os arquivos de dados que não são mais referenciados por nenhum snapshot retido. Sintaxe:
Por padrão, quais snapshots devem ser mantidos são definidos pela política de retenção (propriedades da tabela min-snapshots-to-keep, max-snapshot-age-ms e substituições por ref). Quando snapshot_ids é especificado, a política de retenção é ignorada e apenas os snapshots listados são considerados para expiração. Argumentos:
  • 'timestamp' (posicional) ou expire_before = 'timestamp' — uma string de data e hora (por exemplo, '2024-06-01 00:00:00') interpretada no fuso horário do servidor. Funciona como uma trava de segurança: snapshots cujo timestamp-ms seja igual ou posterior a esse valor ficam protegidos contra expiração, mesmo que a política de retenção, de outra forma, os expirasse. Pode ser combinado com snapshot_ids; nesse caso, snapshots listados com timestamp igual ou mais recente que esse valor não expiram.
  • retention_period = '<duration>' — substitui o history.expire.max-snapshot-age-ms no nível da tabela apenas nesta invocação. Snapshots mais antigos do que essa duração (medida a partir de agora) tornam-se candidatos à expiração. O valor é uma string de duração composta por um ou mais pares {number}{unit} concatenados. Unidades aceitas: y (365 dias), w (7 dias), d (24 horas), h (60 minutos), m (60 segundos), s (1 segundo), ms (1 milissegundo). As unidades podem ser combinadas, por exemplo: '3d', '12h', '1d12h30m', '500ms'.
  • retain_last = N — substitui o history.expire.min-snapshots-to-keep no nível da tabela apenas nesta invocação. Pelo menos N snapshots são sempre mantidos, independentemente da idade.
  • snapshot_ids = [id1, id2, ...] — expira exatamente os IDs de snapshot listados (exceto snapshots referenciados pelo snapshot atual, branches ou tags). Esse modo ignora completamente a política de retenção e não pode ser combinado com retention_period nem com retain_last.
  • dry_run = 1 — calcula o que seria expirado e retorna métricas sem gravar novos metadados nem excluir arquivos.
retention_period e retain_last substituem apenas os padrões de retenção no nível da tabela. Substituições de retenção por ref (branch/tag) configuradas nas propriedades da tabela Iceberg (por exemplo, refs.<branch>.min-snapshots-to-keep) nunca são substituídas — elas sempre entram em vigor conforme especificado nos metadados da tabela.
Exemplo:
Saída: O comando retorna uma tabela com duas colunas (metric_name String, metric_value Int64), contendo uma linha por métrica. Os nomes das métricas seguem a especificação do Iceberg: O comando executa as seguintes etapas:
  1. Avalia a política de retenção (veja abaixo) para determinar quais snapshots devem ser preservados
  2. Se um argumento de timestamp tiver sido fornecido, também protege todos os snapshots nesse timestamp ou posteriores
  3. Expira os snapshots que não forem retidos pela política nem protegidos pelo limite de timestamp
  4. Calcula quais arquivos estão associados exclusivamente a snapshots expirados
  5. No modo normal: gera novos metadados sem os snapshots expirados
  6. No modo normal: exclui fisicamente listas de manifesto, arquivos de manifesto e arquivos de dados inacessíveis
  7. No modo dry_run = 1: ignora as etapas 5 e 6 e retorna apenas as métricas calculadas

Política de retenção de snapshots

O comando expire_snapshots respeita a política de retenção de snapshots do Iceberg. A retenção é configurada por meio de propriedades da tabela Iceberg e de substituições específicas por referência: Cada referência de snapshot (refs nos metadados do Iceberg) pode substituir esses valores com campos específicos por referência: min-snapshots-to-keep, max-snapshot-age-ms e max-ref-age-ms. Avaliação da retenção:
  • Para cada branch (incluindo main): a cadeia ancestral é percorrida a partir do head da branch. Os snapshots são mantidos enquanto qualquer uma destas condições for verdadeira:
    • O snapshot está entre os primeiros min-snapshots-to-keep da cadeia
    • A idade do snapshot está dentro de max-snapshot-age-ms (ou seja, now - timestamp-ms <= max-snapshot-age-ms)
  • Para tags: o snapshot marcado pela tag é mantido, a menos que a tag tenha excedido seu max-ref-age-ms, caso em que a referência da tag é removida
  • Referências diferentes de main cuja idade exceda max-ref-age-ms são removidas por completo (a branch main nunca é removida)
  • Referências órfãs que apontam para snapshots inexistentes são removidas com um aviso
  • O snapshot atual é sempre preservado, independentemente das configurações de retenção
Privilégios necessários: O privilégio ALTER TABLE EXECUTE é necessário, e ele é um privilégio filho de ALTER TABLE na hierarquia de controle de acesso do ClickHouse. Você pode concedê-lo especificamente ou por meio do privilégio pai:
  • Somente tabelas Iceberg format version 2 são suportadas (snapshots v1 não garantem manifest-list, que é necessário para identificar com segurança os arquivos a serem removidos)
  • O snapshot atual é sempre preservado, mesmo que seja mais antigo que o timestamp especificado
  • Exige que a configuração allow_insert_into_iceberg esteja habilitada
  • Exige que a configuração allow_experimental_expire_snapshots esteja habilitada
  • A autorização do próprio catálogo (autenticação do catálogo REST, AWS Glue IAM etc.) é aplicada independentemente quando o ClickHouse atualiza os metadados

Remover arquivos órfãos

Arquivos órfãos são arquivos no armazenamento que não são referenciados por nenhum snapshot nos metadados da tabela Iceberg. Eles se acumulam devido a gravações com falha, limpeza parcial após a compactação e operações interrompidas, causando crescimento descontrolado do armazenamento. O comando remove_orphan_files identifica e remove esses arquivos órfãos. Sintaxe:
Parâmetros: Exemplos:
Saída: O comando retorna uma tabela com as colunas metric_name e metric_value, mostrando a contagem de arquivos excluídos (ou que seriam excluídos no modo dry_run) por categoria. As categorias de arquivos são classificadas com base em heurísticas de melhor esforço, seguindo convenções de nomenclatura de arquivos; arquivos que não correspondem a nenhum padrão específico são contabilizados por padrão em deleted_data_files_count: Configurações:
  • Requer o Iceberg format version 2 (ou superior). Tabelas da versão 1 são rejeitadas porque não têm ponteiros manifest-list em snapshots, que são necessários para determinar com segurança o conjunto de arquivos alcançáveis. Executar o comando em uma tabela v1 retorna um erro BAD_ARGUMENTS.
  • Requer que as configurações allow_insert_into_iceberg e allow_iceberg_remove_orphan_files estejam habilitadas
  • Recomenda-se executar expire_snapshots antes de remove_orphan_files, para que os arquivos referenciados exclusivamente por snapshots expirados sejam removidos primeiro
  • Use dry_run = 1 para visualizar os arquivos órfãos antes da exclusão
  • O limite older_than protege contra a exclusão de arquivos de gravações em andamento — o limite padrão de 3 dias oferece uma margem de segurança generosa

Veja também

Última modificação em 2 de julho de 2026