Iceberg v4 ganha stats-only fields para guardar estatísticas de expressões de partição
Aprofundamento CEVIU
Aprofundamento
A proposta de spec (PR 18405 no repositório do Apache Iceberg) adiciona os stats-only fields aos metadados da tabela. Um campo desse tipo serve para rastrear estatísticas de um valor derivado que não é materializado. O exemplo do próprio PR é guardar estatísticas de to_lower_case(name) sem criar uma coluna nova. O texto prevê dois casos: campos de partição, para o resultado de bucket partitioning, e expressões de valor, para usos como o da string em minúsculas.
A discussão no PR mostra os pontos delicados do desenho. O tipo partition-value não exige data-type, porque o tipo pode ser promovido (de int para long, por exemplo) quando a coluna de origem é alargada, e o metadado ficaria defasado. A proposta em debate pede data-type sempre que o tipo do campo não define como derivar o resultado, e ele deve ser primitivo ou variant. Sobre escrita, o texto atual diz que o writer deve preservar estatísticas existentes quando o data-type é conhecido. Deve produzir estatísticas quando possível. Se a expressão não é suportada, gera tipo incompatível ao ser vinculada ou falha na vinculação, o writer grava o struct de estatísticas do campo como nulo.
Os autores também reconhecem um risco: promoções de tipo (como date para timestamp) podem mudar o valor de uma expressão como bucket, o que poderia causar pruning incorreto. A resposta no PR foi tratar isso em discussão separada e orientar o uso de expressões que deem resultado consistente entre promoções de tipo.
Por que isso importa
Para quem modela tabelas Iceberg e cuida de desempenho de consulta, isso abre caminho para filtrar por expressões frequentes (buckets, texto normalizado) sem duplicar colunas e sem pagar armazenamento extra. É uma leitura editorial: o ganho depende de engines e writers implementarem a spec e do cuidado com a evolução de schema, já que expressões que mudam de comportamento invalidam estatísticas antigas.
Perguntas frequentes
O que são stats-only fields no Iceberg v4?
São campos de metadados que guardam estatísticas de um valor derivado, como to_lower_case(name) ou o resultado de um bucket de partição, sem materializar uma coluna na tabela. As estatísticas ficam nas estruturas content_stats dos manifests.
Para que serve o flag tight_stats?
Ele marca, no nível de arquivo, contagens exatas de linhas ativas e limites elegíveis. Com isso o planejamento de consultas melhora e, em alguns casos, dá para fazer computações só com metadados, sem varrer os arquivos de dados.
O que acontece se a expressão não puder ser avaliada pelo writer?
Segundo o texto em discussão no PR, o writer deve gravar o struct de estatísticas do campo como nulo quando a expressão não é suportada, gera tipo incompatível ou a vinculação falha. Estatísticas já existentes devem ser preservadas se o data-type for conhecido.
Promover o tipo da coluna de origem pode invalidar as estatísticas?
Pode, em casos como bucket sobre date promovido a timestamp, em que o valor do hash muda. Os mantenedores disseram que isso merece discussão própria e recomendam usar expressões que produzam resultado consistente entre promoções de tipo.
Fontes
- github.comfonte original
- Categoria
- CEVIU Dados
- Publicado
- 12 de novembro de 2026
- Editoria
- CEVIU Dados

