+− THE DAILY DIFFdev & AI news
NEEDS REVIEW

Polars 2.0: per què les unions ja no mantenen l'ordre de les files

Polars 2.0 executa la funció collect amb un motor de streaming per defecte.

Polars 2.0 executa la funció collect amb un motor de streaming per defecte. Per a join, group_by i unpivot, la versió ja no garanteix l'ordre de les files d'entrada tret que s'estableixi explícitament maintain_order o sort. En la nostra prova amb Polars 2.0.0, una unió interna de 2.000.000 de files va retornar les files fora de l'ordre d'entrada per defecte i va mantenir l'ordre amb maintain_order establert. La versió també activa l'"out-of-core spilling" i fa que les afirmacions de referència siguin pròpies del proveïdor.

Llegeix l'edició escrita (anglès) ↗

Què cobreix aquest vídeo

  • La crida a collect() en una consulta lazy ara utilitza el motor de streaming per defecte, que no garanteix l'ordre de les files per a join, group_by i unpivot.
  • La guia de migració diu que l'ordre ja no és l'ordre anterior a la versió 2.0 i no està garantida; recomana una ordenació explícita si se'n depèn.
  • En la nostra prova, una unió interna per defecte va retornar False per a l'ordre d'entrada; maintain_order="left_right" en la unió va retornar True. Una màquina, una execució, una forma d'unió.
  • L'"out-of-core spilling" està activat per defecte: comença al voltant del 80% de la RAM, amb un pressupost de disc per defecte de 64 GB. Les operacions de "join" i "group_by" "out-of-core" estan en el full de ruta.
  • collect_schema() detecta una columna que falta abans que es llegeixi cap dada, però un "cast" que falla en un sol valor només falla en collect().
  • La comparació TPC-H i TPC-DS és la pròpia execució del proveïdor amb dades derivades, i la seva nota a peu de pàgina indica que els resultats no són comparables amb els benchmarks oficials.

Transcripció traduïda

Traduït de la narració original en anglès. L'àudio i els subtítols disponibles estan controlats per YouTube.

Per què va canviar l'ordre per defecte?

0:00 Creus que una unió et retorna les files en l'ordre en què les vas escriure. Polars 2.0 va deixar de prometre això, per defecte, a propòsit. En aquest vídeo: per què va canviar el valor per defecte? Què va guanyar? I quin dels teus scripts es trenca primer? Això és The Daily Diff, sota el capó. Polars és una biblioteca de DataFrame de codi obert: un motor de taules que crides des de Python,

0:20 amb el seu nucli escrit en Rust. És gratuït sota la llicència MIT, i l'instal·les amb pip install polars. Un detall primer. L'interruptor que recupera l'ordre antic és un argument de la unió mateixa. Tornaré a això al final. Des de la versió 2.0, collect executa el motor de streaming per defecte. El streaming divideix la consulta en trossos que s'executen en paral·lel, i els trossos acaben quan acaben.

0:42 Per a join, group by i unpivot, la versió no promet un ordre. Qui en surt perjudicat primer? Qualsevol que compari la sortida amb un fitxer desat, fila per fila. Aquesta prova pot passar al teu portàtil i fallar en una màquina diferent. A continuació, la guia de migració.

Què promet la guia de migració?

0:57 Diu que l'ordre exacte de les files mostrat anteriorment no està garantit. Així que si depens de l'ordre, ordena explícitament. L'"out-of-core" també està activat per defecte. Comença a desbordar-se al disc al voltant del vuitanta per cent de la RAM, amb un pressupost de seixanta-quatre gigabytes. Sort, funcions de finestra i moltes expressions poden desbordar-se ara. Les unions i els "group-by" estan arribant.

La referència és una comparació justa?

1:17 Polars diu que supera DataFusion i DuckDB en els benchmarks TPC-H i TPC-DS. Els números provenen de les seves pròpies execucions, amb dades derivades, i la seva nota a peu de pàgina diu que no són comparables amb els resultats oficials. Els seus propis números diuen que Polars és aproximadament 3,8 vegades més ràpid amb setze nuclis a cent noranta-dos, en TPC-H. També diuen que els fils addicionals de la màquina gran frenen les consultes petites.

Què veiem quan l'executem?

1:41 Vam executar la mateixa unió dues vegades a Polars 2.0.0. L'execució per defecte barreja les files. Amb la bandera, l'ordre d'entrada es manté. Troba les unions que alimenten una prova. Qualsevol unió sense una ordenació posterior és una decisió d'ordre de files que mai vas prendre. Polars 2.0 és més estricte amb els tipus.

Més estricte significa abans?

1:58 La comprovació d'esquema detecta una columna que falta abans que es llegeixi cap dada. No pot detectar un "cast" que falla en una fila, perquè aquest error espera les dades. Ara el bucle que vaig obrir.

Com recupero l'ordre antic?

2:08 L'interruptor es troba a la unió. Estableix "maintain order" a la unió, o afegeix una ordenació després. La guia suggereix l'ordenació. La bandera de la unió va mantenir l'ordre en la nostra execució, amb l'ordre del costat esquerre mantingut com esquerra, dreta. Veredicte, sota el capó: NEEDS REVIEW.

Quin és el veredicte?

2:22 Revisaria cada unió abans d'actualitzar. Tens alguna pregunta sobre això? Posa-la als comentaris. I aquesta és la diferència per avui. Sóc en Niko d'Axrisi. Fusiona amb responsabilitat.

Fonts

  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 relacionats