Polars
A biblioteca DataFrame rápida para Rust - otimização de consulta lazy, execução vetorizada e layout de memória com base em Arrow.
Busque em todas as páginas da documentação
A biblioteca DataFrame rápida para Rust - otimização de consulta lazy, execução vetorizada e layout de memória com base em Arrow.
Cartão de receita de referência rápida - pronto para copiar e colar.
use polars::prelude::*;
fn top_spenders(path: &str) -> PolarsResult<DataFrame> {
LazyCsvReader::new(path.into())
.with_has_header(true)
.finish()?
.group_by([col("customer_id")])
.agg([col("amount").sum().alias("total")])
.sort(["total"], SortMultipleOptions::default())
.limit(10)
.collect()
}Quando usar isso:
use polars::prelude::*;
fn main() -> PolarsResult<()> {
let df = df! {
"region" => ["west", "east", "west", "north"],
"amount" => [120i64, 80, 200, 50],
}?;
let summary = df
.lazy()
.filter(col("amount").gt(lit(60)))
.group_by([col("region")])
.agg([
col("amount").sum().alias("total"),
col("amount").mean().alias("avg"),
])
.sort(["total"], SortMultipleOptions::default())
.collect()?;
println!("{}", summary);
Ok(())
}O que isso demonstra:
.lazy() para execução otimizadacollect() executa o plano - esse é o limite do seu pico de memória e CPU.DataFrame rodam imediatamente - modelo mental mais simples, menos otimizações.| Modo | API | Melhor para |
|---|---|---|
| Eager | DataFrame::filter, group_by | Testes unitários, tabelas minúsculas |
| Lazy | LazyFrame + collect() | Arquivos grandes, pipelines multi-etapas |
// Prefira aliases explícitos em agg - expressões sem nome são difíceis de identificar em planos explain.
.col("amount").sum().alias("total")
// Use .explain() em planos lazy durante o desenvolvimento.
println!("{}", lf.explain(true)?);collect() após cada etapa anula a otimização lazy. Correção: encadeie transformações, colete uma vez no final.with_dtypes ou faça o cast após o carregamento.i32 vs i64 silenciosamente descartam linhas. Correção: faça o cast de ambos os lados para o mesmo tipo antes do join.id quando precisar de identidade de linha estável.select * em 500 colunas carrega tudo. Correção: projete apenas as colunas necessárias na varredura lazy.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| DataFusion SQL | Equipe pensa em SQL sobre tabelas registradas | Você quer um DSL de expressão Rust no código da aplicação |
| pandas (Python) | Exploração de notebook com um ecossistema enorme | ETL de produção que necessita de deploy de binário único |
| DuckDB embarcado | Análises SQL-first em arquivos | Você está padronizando dependências puras de Rust |
| ndarray + loops manuais | Pequenos kernels numéricos | Transformações relacionais e pipelines intensivos em I/O |
Use lazy por padrão para pipelines baseados em arquivos. Use eager para testes, exploração estilo REPL e frames que já cabem na memória.
Chame .explain(true) no LazyFrame antes de collect() para ver o pushdown de predicado e a poda de projeção.
Sim. Muitas operações paralelizam entre colunas e grupos de linhas. Controle a contagem de threads com POLARS_MAX_THREADS ao colocar serviços em co-localização.
Use scan_parquet / scan_csv com caminhos compatíveis e flags de recursos para backends de nuvem, ou prepare arquivos localmente para operações mais simples.
Use expressões fill_null, drop_nulls ou coalesce. dtypes anuláveis devem corresponder às expectativas do esquema na escrita.
Mantenha-se na API de expressões (col, lit, when) documentada para 0.46+. Padrões mais antigos de lazy::dsl podem diferir - fixe versões em CI.
Converta para Arrow RecordBatch e passe via PyArrow - veja Interoperabilidade com Python/pandas.
Para memória limitada, combine leituras de CSV em chunks ou escaneie grupos de linhas Parquet - veja Streaming e Dados Grandes.
Use ParquetWriter ou CsvWriter em frames eager após o collect() final.
Registre a saída do Polars como tabelas Arrow no DataFusion para camadas SQL - veja DataFusion.
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026