I/O CSV/Parquet
Leia e escreva CSV e Parquet em Rust com esquemas previsíveis, compressão e desempenho de varredura.
Busque em todas as páginas da documentação
Leia e escreva CSV e Parquet em Rust com esquemas previsíveis, compressão e desempenho de varredura.
Cartão de receita de referência rápida - pronto para copiar e colar.
use polars::prelude::*;
fn csv_to_parquet(csv_path: &str, parquet_path: &str) -> PolarsResult<()> {
let mut df = CsvReadOptions::default()
.with_has_header(true)
.try_into_reader_with_file_path(Some(csv_path.into()))?
.finish()?;
ParquetWriter::new(std::fs::File::create(parquet_path)?)
.with_compression(ParquetCompression::Zstd(None))
.finish(&mut df)?;
Ok(())
}Quando usar isso:
use polars::prelude::*;
fn main() -> PolarsResult<()> {
let schema = Schema::from_iter([
Field::new("order_id".into(), DataType::Int64),
Field::new("region".into(), DataType::String),
Field::new("amount".into(), DataType::Float64),
]);
let df = CsvReadOptions::default()
.with_has_header(true)
.with_schema(Some(Arc::new(schema)))
.try_into_reader_with_file_path(Some("orders.csv".into()))?
.finish()?;
let filtered = df
.lazy()
.filter(col("amount").gt(lit(0.0)))
.collect()?;
let mut out = filtered.clone();
ParquetWriter::new(std::fs::File::create("orders_clean.parquet")?)
.with_row_group_size(Some(128_000))
.finish(&mut out)?;
Ok(())
}O que isso demonstra:
| Formato | Força | Cuidado com |
|---|---|---|
| CSV | Exportação universal | Sem esquema embutido; custo de parsing |
| Parquet | Análise, compressão | Não legível por humanos; disciplina de evolução de esquema |
// Varredura Lazy evita carregar CSV completo:
LazyCsvReader::new("big.csv".into()).with_has_header(true).finish()?;
// Ler subconjunto de colunas Parquet:
LazyFrame::scan_parquet("big.parquet", ScanArgsParquet::default())?
.select([col("user_id"), col("event_time")]);1,5 vs 1.5 quebram a inferência. Correção: normalize arquivos ou defina o separador decimal nas opções.utf8-lossy.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| JSON Lines | Logs de eventos semiestruturados | Agregação numérica pesada |
| Arrow IPC | Transferência zero-copy intraprocesso | Arquivamento de longo prazo |
| Avro | Evolução de esquema em pipelines Kafka | Consultas interativas de BI |
| SQLite | Pequenas fatias transacionais | Varreduras colunares de escala TB |
ZSTD equilibra taxa e velocidade para análise. Snappy é mais rápido, arquivos maiores. Faça benchmark em seu hardware e padrões de leitura.
Use with_ignore_errors com cautela, registre rejeições em um arquivo de "dead-letter" e conte as linhas descartadas nas métricas.
Sim - scan_parquet lazy com projeção de coluna evita a decodificação de campos não utilizados.
Grave diretórios no estilo Hive region=west/data.parquet. Consumidores filtram caminhos por chaves de partição antes da varredura.
Armazene timestamps como UTC com notas de metadados. Converta na leitura para fusos horários de exibição.
Use leitores em chunks além do tamanho da RAM - veja Streaming & Large Data.
CSV com Gzip é bom para arquivo; prefira Parquet para qualquer coisa consultada mais de uma vez.
Afirme os dtypes no DataFrame antes de ParquetWriter::finish e rejeite gravações que se desviam de um registro de esquema versionado.
Sim - Parquet é multilíngue. Mantenha tipos lógicos compatíveis com Arrow para uma transição suave.
Converta para CSV em uma etapa de pré-processamento ou use um crate dedicado para XLSX - não ideal para pipelines de análise de produção.
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