Delta Lake Sem JVM e PySpark em Projetos Rust e Python
Qualquer pessoa que tentou adotar o formato Delta Lake em serviços pequenos ou scripts rapidamente encontra uma realidade dura. Para simplesmente ler alguns gigabytes de arquivos de log de transação, você precisa arrastar junto o Apache Spark, e com ele a infraestrutura pesada de JVM. Em grandes plataformas de dados isso é justificado, mas para uma aplicação local, um microsserviço em segundo plano, ou uma função serverless da AWS Lambda, tal solução parece muito pesada.
Desenvolvedores da comunidade Delta Lake decidiram preencher essa lacuna. Eles criaram o projeto delta-rs — uma biblioteca nativa para trabalhar com Delta Lake em Rust, com bindings oficiais para Python.
Por Que Outra Biblioteca de Dados
O formato Delta Lake é excelente porque resolve os principais pontos problemáticos do armazenamento de arquivos aberto. Ele adiciona um log de transação ACID sobre arquivos Parquet, histórico de alterações com capacidade de reverter para versões anteriores (viagem no tempo), e aplicação rigorosa de schema.
A stack clássica em torno do Delta Lake historicamente foi vinculada a Scala e Java. Se sua stack principal é Rust ou Python leve sem frameworks pesados como PySpark, antes do delta-rs, suas opções eram limitadas.
A biblioteca fornece APIs de baixo nível para Rust e uma interface de alto nível para Python. Agora você pode escrever dados com garantias ACID para um bucket S3 ou disco local em apenas algumas linhas de código sem iniciar processos JVM.
Início Rápido em Python e Rust
A interface do pacote Python deltalake é projetada para que desenvolvedores não precisem reaprender nada. Ela se integra facilmente com bibliotecas analíticas familiares — Pandas, Arrow ou Polars.
Escrever e ler uma tabela em Python parece muito familiar:
import pandas as pd
from deltalake import DeltaTable, write_deltalake
# Создаем тестовый датафрейм и сохраняем его в формате Delta
df = pd.DataFrame({"id": [1, 2], "value": ["foo", "boo"]})
write_deltalake("./data/delta", df)
# Считываем данные обратно
dt = DeltaTable("./data/delta")
df_read = dt.to_pandas()
assert df.equals(df_read)
Um detalhe interessante: você pode abrir instantaneamente a mesma tabela de uma aplicação Rust. Nenhum assembly manual de metadados é necessário. A biblioteca analisará automaticamente o log de commit JSON no diretório _delta_log.
Exemplo de leitura de metadados de tabela em Rust:
use deltalake::{open_table, DeltaTableError};
use url::Url;
#[tokio::main]
async fn main() -> Result<(), DeltaTableError> {
let delta_path = Url::from_directory_path("/abs/data/delta").unwrap();
let table = open_table(delta_path).await?;
let files: Vec<_> = table.get_file_uris()?.collect();
println!("{files:?}");
Ok(())
}
Por Trás dos Panos e Integrações
Alta velocidade e baixo consumo de memória não são acidentais. O projeto é construído sobre o motor Apache Arrow e o motor vetorial DataFusion. Rust é usado para gerenciamento seguro de memória e I/O paralelo ao trabalhar com armazenamento em nuvem.
A biblioteca pode trabalhar diretamente com AWS S3, Google Cloud Storage, Azure Blob Storage e o sistema de arquivos local.
Graças à base compartilhada em Rust e Arrow, delta-rs rapidamente se tornou parte do ecossistema moderno de processamento de dados. Ferramentas populares funcionam com ele prontamente:
- Polars usa delta-rs para leitura e escrita direta de tabelas Delta.
- DuckDB pode executar consultas SQL analíticas contra logs Delta.
- Da, Dask e Ray usam este módulo para processamento distribuído de dados em Python.
- AWS SDK for Pandas o utiliza como motor nativo para o formato Delta.
Casos de Uso Práticos
Em quais situações o delta-rs supera a abordagem clássica?
O primeiro caso é arquitetura de microsserviços. Por exemplo, você tem um serviço em Rust ou Python que coleta eventos de uma fila de mensagens e precisa anexar lotes a um armazenamento de dados a cada cinco minutos. Girar um cluster Spark para isso é caro e complexo de manter. Com delta-rs, o serviço simplesmente vincula a biblioteca e grava dados diretamente no S3.
O segundo caso é pipelines ETL leves. Se seus volumes de dados são medidos em dezenas ou centenas de gigabytes, Polars combinado com delta-rs os processará em uma única instância mais rápido do que um cluster PySpark pode ser provisionado.
O terceiro caso é arquitetura Serverless. Em funções AWS Lambda com limites rígidos no tamanho da imagem e tempo de inicialização, encaixar um ambiente Java é problemático. Um binário Rust compilado com delta-rs inicia em milissegundos.
O projeto tem limitações? Sim, a especificação Delta Lake é bastante extensa e é constantemente atualizada pelo Databricks. Alguns recursos raros ou novos do formato são implementados no delta-rs com um leve atraso. Antes de usar operações complexas como MERGE com condições específicas, você deve verificar a tabela de recursos suportados na documentação do projeto.
Conclusão
A equipe delta-io fez um excelente trabalho. A biblioteca nativa Rust trouxe leveza de volta ao trabalho com o formato Delta Lake.
Se você precisa de transacionalidade, versionamento de dados e armazenamento confiável sobre Parquet, mas não quer lidar com infraestrutura Java, definitivamente experimente o delta-rs. Você pode instalar o pacote em Python com o comando pip install deltalake, e adicioná-lo a um projeto Rust via cargo add deltalake.
Projetos relacionados