Formato de tabela aberto para datasets analíticos enormes, com suporte a schema evolution e time travel.
Apache Iceberg é um formato de tabela aberto para datasets analíticos enormes. Projetado para resolver problemas de performance, confiabilidade e evolução em data lakes, oferece recursos como ACID transactions, schema evolution e time travel queries.
Desenvolvido originalmente pela Netflix em 2017 para resolver limitações das tabelas Hive, foi doado para a Apache Software Foundation em 2018. Tornou-se um projeto top-level em 2020 e ganhou adoção massiva na comunidade de big data.
Iceberg usa uma arquitetura de três camadas: dados (arquivos Parquet/ORC), manifests (metadados de arquivos) e metadata (snapshots e schema). Esta estrutura permite operações eficientes como pruning de partições e evolução de schema sem reescrever dados.
Adicione, remova ou renomeie colunas sem reescrever dados existentes.
Consulte dados como estavam em qualquer ponto no tempo.
Garantias de consistência para operações concorrentes.
Particionamento automático sem exposição na API.
Formatos de Arquivo: | Parquet, ORC, Avro |
Engines Suportados: | Spark, Flink, Trino, Impala |
Storage Backends: | HDFS, S3, GCS, Azure Blob |
Catalog Implementations: | Hive, Hadoop, Nessie, REST |
Linguagens API: | Java, Python, Scala |
Substituição de tabelas Hive tradicionais com recursos avançados de gerenciamento.
Exemplo: Netflix migrou milhares de tabelas Hive para Iceberg para melhor performance.Streaming analytics com garantias ACID e schema evolution.
Exemplo: Empresas de fintech usam para analytics de transações em tempo real.Auditoria e compliance com time travel e versionamento de dados.
Exemplo: Bancos usam time travel para auditoria regulatória.-- Criar tabela Iceberg
CREATE TABLE my_catalog.db.events (
id bigint,
event_time timestamp,
user_id string,
event_type string
) USING iceberg
PARTITIONED BY (days(event_time))
-- Inserir dados
INSERT INTO my_catalog.db.events VALUES
(1, '2024-01-01 10:00:00', 'user1', 'login'),
(2, '2024-01-01 11:00:00', 'user2', 'purchase')
-- Time travel query
SELECT * FROM my_catalog.db.events
TIMESTAMP AS OF '2024-01-01 10:30:00'
-- Schema evolution
ALTER TABLE my_catalog.db.events
ADD COLUMN session_id string
from pyiceberg.catalog import load_catalog
import pandas as pd
# Carregar catalog
catalog = load_catalog("my_catalog")
# Criar tabela
schema = pa.schema([
pa.field("id", pa.int64()),
pa.field("event_time", pa.timestamp('us')),
pa.field("user_id", pa.string()),
pa.field("event_type", pa.string())
])
table = catalog.create_table(
"db.events",
schema=schema,
partition_spec=PartitionSpec(
PartitionField(source_id=2, field_id=1000, transform=DayTransform(), name="event_time_day")
)
)
# Inserir dados
df = pd.DataFrame({
'id': [1, 2, 3],
'event_time': pd.to_datetime(['2024-01-01 10:00:00', '2024-01-01 11:00:00', '2024-01-01 12:00:00']),
'user_id': ['user1', 'user2', 'user3'],
'event_type': ['login', 'purchase', 'logout']
})
table.append(df)
# Ler dados
scan = table.scan()
df_result = scan.to_pandas()
-- Configurar catalog Iceberg
CREATE CATALOG iceberg_catalog WITH (
'type'='iceberg',
'catalog-type'='hive',
'uri'='thrift://localhost:9083',
'warehouse'='hdfs://namenode:port/path/to/warehouse'
);
USE CATALOG iceberg_catalog;
-- Criar tabela para streaming
CREATE TABLE events (
id BIGINT,
event_time TIMESTAMP(3),
user_id STRING,
event_type STRING,
WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) PARTITIONED BY (event_type);
-- Streaming insert
INSERT INTO events
SELECT id, event_time, user_id, event_type
FROM kafka_source;
Tecnologia | Schema Evolution | Time Travel | Performance | Maturidade |
---|---|---|---|---|
Apache Iceberg | ★★★★★ | ★★★★★ | ★★★★☆ | ★★★★☆ |
Delta Lake | ★★★★☆ | ★★★★★ | ★★★★★ | ★★★★★ |
Apache Hudi | ★★★☆☆ | ★★★☆☆ | ★★★★☆ | ★★★☆☆ |
Hive Tables | ★★☆☆☆ | ★☆☆☆☆ | ★★☆☆☆ | ★★★★★ |
Escolha Apache Iceberg se você precisa de schema evolution robusta e compatibilidade com múltiplos engines. É ideal para ambientes heterogêneos onde diferentes ferramentas precisam acessar os mesmos dados.