Sintaxe
Argumentos
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
Exemplo
Definindo uma coleção nomeada
Usando um catálogo de dados
IcebergS3 e forneça as configurações necessárias.
Por exemplo, usando o REST Catalog com armazenamento MinIO:
Evolução de esquema
- int -> long
- float -> double
- decimal(P, S) -> decimal(P’, S), em que P’ > P.
Poda de partições
use_iceberg_partition_pruning = 1. Para mais informações sobre partition pruning no Iceberg, acesse https://iceberg.apache.org/spec/#partitioning
Viagem no tempo
Processamento de tabelas com linhas excluídas
- Exclusões por igualdade
- Vetores de exclusão (introduzidos na v3)
Uso básico
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
Cenário 1: Alterações no esquema sem novos snapshots
- 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
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
Resolução do arquivo de metadados
iceberg no ClickHouse, o sistema precisa localizar o arquivo metadata.json correto que descreve a estrutura da tabela Iceberg. Veja como esse processo funciona:
Busca de candidatos (em ordem de prioridade)
- 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.
-
Correspondência do UUID da tabela:
*Se
iceberg_metadata_table_uuidfor especificado, o sistema irá: *Considerar apenas os arquivos.metadata.jsonno diretóriometadata*Filtrar os arquivos que contêm um campotable-uuidcorrespondente ao UUID especificado (sem diferenciar maiúsculas de minúsculas) -
Busca padrão:
*Se nenhuma das configurações acima for fornecida, todos os arquivos
.metadata.jsonno diretóriometadatapassam a ser candidatos
Selecionando o arquivo mais recente
-
Se
iceberg_recent_metadata_file_by_last_updated_ms_fieldestiver 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
Vem nomes de arquivo no formatoV.metadata.jsonouV-uuid.metadata.json)
iceberg no ClickHouse interpreta diretamente arquivos armazenados no S3 como tabelas Iceberg, por isso é importante entender essas regras de resolução.
Cache de metadados
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
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
Criando tabela
Exemplo
iceberg_use_version_hint.
Se quiser comprimir o arquivo metadata.json, especifique o nome do codec na configuração iceberg_metadata_compression_method.
INSERT
Exemplo
DELETE
Exemplo
Evolução do esquema
Exemplo
Compactação
Expirar snapshots
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:
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) ouexpire_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 cujotimestamp-msseja 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 comsnapshot_ids; nesse caso, snapshots listados com timestamp igual ou mais recente que esse valor não expiram.retention_period = '<duration>'— substitui ohistory.expire.max-snapshot-age-msno 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 ohistory.expire.min-snapshots-to-keepno nível da tabela apenas nesta invocação. Pelo menosNsnapshots 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 comretention_periodnem comretain_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.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:
- Avalia a política de retenção (veja abaixo) para determinar quais snapshots devem ser preservados
- Se um argumento de timestamp tiver sido fornecido, também protege todos os snapshots nesse timestamp ou posteriores
- Expira os snapshots que não forem retidos pela política nem protegidos pelo limite de timestamp
- Calcula quais arquivos estão associados exclusivamente a snapshots expirados
- No modo normal: gera novos metadados sem os snapshots expirados
- No modo normal: exclui fisicamente listas de manifesto, arquivos de manifesto e arquivos de dados inacessíveis
- 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
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-keepda cadeia - A idade do snapshot está dentro de
max-snapshot-age-ms(ou seja,now - timestamp-ms <= max-snapshot-age-ms)
- O snapshot está entre os primeiros
- 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
maincuja idade excedamax-ref-age-mssão removidas por completo (a branchmainnunca é 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
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_icebergesteja habilitada - Exige que a configuração
allow_experimental_expire_snapshotsesteja 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
remove_orphan_files identifica e remove esses arquivos órfãos.
Sintaxe:
Exemplos:
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-listem 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 erroBAD_ARGUMENTS. - Requer que as configurações
allow_insert_into_icebergeallow_iceberg_remove_orphan_filesestejam habilitadas - Recomenda-se executar
expire_snapshotsantes deremove_orphan_files, para que os arquivos referenciados exclusivamente por snapshots expirados sejam removidos primeiro - Use
dry_run = 1para visualizar os arquivos órfãos antes da exclusão - O limite
older_thanprotege 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