# Polars 2.0: por que as junções já não mantêm a ordem das linhas

Published: 2026-10-08

O Polars 2.0 executa a coleta num motor de streaming por padrão. Para junção, group\_by e unpivot, a versão já não garante a ordem das linhas de entrada, a menos que se defina explicitamente maintain\_order ou sort. Na nossa execução no polars 2.0.0, uma junção interna de 2.000.000 linhas devolveu as linhas fora da ordem de entrada por padrão e manteve a ordem com maintain\_order definido. A versão também ativa o out-of-core spilling e faz com que as reivindicações de benchmark sejam as do próprio fornecedor.

Canonical: https://thedailydiff.dev/pt-PT/video/polars-2-row-order/

## O que este vídeo aborda

- Chamar collect() numa consulta lazy agora usa o motor de streaming por padrão, o que não garante a ordem das linhas para join, group\_by e unpivot.
- O guia de migração diz que a ordem já não é a ordem pré-2.0 e não é garantida; recomenda uma ordenação explícita se depender dela.
- Na nossa execução, uma junção interna padrão devolveu a ordem de entrada Falso; maintain\_order="left\_right" na junção devolveu Verdadeiro. Uma máquina, uma execução, uma forma de junção.
- O out-of-core spilling está ativado por padrão: começa em cerca de 80 % da RAM, com um orçamento de disco padrão de 64 GB. Junções e group\_by out-of-core estão no roteiro.
- collect\_schema() deteta uma coluna em falta antes que quaisquer dados sejam lidos, mas uma conversão que falha num único valor só falha em collect().
- A comparação TPC-H e TPC-DS é a própria execução do fornecedor em dados derivados, e a sua nota de rodapé diz que os resultados não são comparáveis a benchmarks oficiais.

## Capítulos

- 0:00 Por que a ordem padrão mudou?
- 0:56 O que o guia de migração promete?
- 1:17 O benchmark é uma luta justa?
- 1:41 O que vemos quando o executamos?
- 1:56 Mais rigoroso significa mais cedo?
- 2:07 Como faço para ter a ordem antiga de volta?
- 2:20 Qual é o veredicto?

## Transcrição traduzida

Traduzido da narração original em inglês. Áudio e legendas disponíveis são controlados pelo YouTube.

### Por que a ordem padrão mudou?

0:00 Você acha que uma junção devolve suas linhas na ordem em que as escreveu. O Polars 2.0 parou de prometer isso, por padrão, de propósito. Neste vídeo: por que a mudança padrão? O que isso trouxe? E qual dos seus scripts quebra primeiro? Este é o The Daily Diff, nos bastidores. Polars é uma biblioteca DataFrame de código aberto: um motor de tabela que você chama do Python,

0:20 com seu núcleo escrito em Rust. É gratuito sob a licença MIT, e você o instala com pip install polars. Um detalhe primeiro. O interruptor que traz a ordem antiga de volta é um argumento para a própria junção. Voltarei a ele no final. Desde a versão 2.0, collect executa o motor de streaming por padrão. Streaming divide a consulta em blocos que são executados em paralelo, e os blocos terminam quando terminam.

0:42 Para join, group by e unpivot, a versão não promete uma ordem. Quem é atingido primeiro? Quem compara a saída com um arquivo salvo, linha por linha. Esse teste pode passar no seu laptop e falhar em uma máquina diferente. A seguir, o guia de migração.

### O que o guia de migração promete?

0:57 Ele diz que a ordem exata das linhas mostrada acima não é garantida. Portanto, se você depende da ordem, ordene explicitamente. O out-of-core também está ativado por padrão. Ele começa a despejar para o disco em cerca de oitenta por cento da RAM, com um orçamento de sessenta e quatro gigabytes. Sort, funções de janela e muitas expressões podem despejar agora. Joins e group-bys estão a caminho.

### O benchmark é uma luta justa?

1:17 Polars diz que supera DataFusion e DuckDB nos benchmarks TPC-H e TPC-DS. Os números vêm de suas próprias execuções, em dados derivados, e sua nota de rodapé diz que não são comparáveis a resultados oficiais. Seus próprios números dizem que Polars fica cerca de três ponto oito vezes mais rápido de dezasseis núcleos para cento e noventa e dois, no TPC-H. Eles também dizem que os threads extras da máquina grande atrasam as pequenas consultas.

### O que vemos quando o executamos?

1:41 Executamos a mesma junção duas vezes no Polars 2.0.0. A execução padrão embaralha as linhas. Com a bandeira, a ordem de entrada sobrevive. Encontre as junções que alimentam um teste. Qualquer junção sem uma ordenação posterior é uma decisão de ordem de linha que você nunca tomou. Polars 2.0 é mais rigoroso com os tipos.

### Mais rigoroso significa mais cedo?

1:58 A verificação de esquema deteta uma coluna ausente antes que qualquer dado seja lido. Não pode detetar uma conversão que falha numa linha, porque esse erro aguarda os dados. Agora o ciclo que abri.

### Como faço para ter a ordem antiga de volta?

2:08 O interruptor vive na junção. Defina maintain\_order na junção, ou adicione uma ordenação depois dela. O guia sugere a ordenação. A bandeira de junção manteve a ordem na nossa execução, com a ordem do lado esquerdo mantida como esquerda, direita. Veredito, nos bastidores: NEEDS REVIEW.

### Qual é o veredicto?

2:22 Eu revisaria cada junção antes de atualizar. Tem alguma pergunta sobre isso? Coloque-a nos comentários. E essa é a diferença de hoje. Eu sou o Niko da Axrisi. Faça o merge com responsabilidade.

## Fontes

- [Release of Polars 2.0](https://pola.rs/posts/release-polars-2/) — Polars (pola.rs)
- [Polars 2.0 upgrade guide](https://docs.pola.rs/releases/upgrade/2/) — Polars documentation
- [Polars homepage](https://pola.rs/) — Polars (pola.rs)
- [polars-2.0-benchmark repository](https://github.com/pola-rs/polars-2.0-benchmark) — Polars on GitHub
- [Release of Polars 2.0 (Hacker News discussion)](https://news.ycombinator.com/item?id=49977177) — Hacker News
