+− THE DAILY DIFFdev & AI news
NEEDS REVIEW

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

O Polars 2.0 executa a coleta num motor de streaming por padrão.

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.

Ler a edição escrita (Inglês) ↗

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.

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

  1. Release of Polars 2.0Polars (pola.rs)
  2. Polars 2.0 upgrade guidePolars documentation
  3. Polars homepagePolars (pola.rs)
  4. polars-2.0-benchmark repositoryPolars on GitHub
  5. Release of Polars 2.0 (Hacker News discussion)Hacker News

Vídeos relacionados