+− THE DAILY DIFFdev & AI news
NEEDS REVIEW

Polars 2.0: por qué las uniones ya no mantienen su orden de filas

Polars 2.0 ejecuta 'collect' en un motor de streaming por defecto.

Polars 2.0 ejecuta 'collect' en un motor de streaming por defecto. Para 'join', 'group_by' y 'unpivot', la versión ya no garantiza el orden de las filas de entrada a menos que configure 'maintain_order' o 'sort' explícitamente. En nuestra ejecución en polars 2.0.0, una unión interna de 2,000,000 de filas devolvió las filas fuera del orden de entrada por defecto y mantuvo el orden con 'maintain_order' configurado. La versión también activa el "spilling out-of-core" y hace propias las afirmaciones de referencia del proveedor.

Leer la edición escrita (inglés) ↗

Lo que cubre este video

  • Llamar a collect() en una consulta lazy ahora usa el motor de streaming por defecto, que no garantiza el orden de las filas para join, group_by y unpivot.
  • La guía de migración dice que el orden ya no es el orden anterior a la versión 2.0 y no está garantizado; recomienda una clasificación explícita si se basa en ella.
  • En nuestra ejecución, una unión interna por defecto devolvió orden de entrada Falso; maintain_order="left_right" en la unión devolvió Verdadero. Una máquina, una ejecución, una forma de unión.
  • El "spilling out-of-core" está activado por defecto: comienza aproximadamente al 80 % de la RAM, con un presupuesto de disco predeterminado de 64 GB. Las uniones y group_by "out-of-core" están en la hoja de ruta.
  • collect_schema() detecta una columna faltante antes de que se lea cualquier dato, pero un 'cast' que falla en un solo valor solo falla en collect().
  • La comparación TPC-H y TPC-DS es una ejecución propia del proveedor sobre datos derivados, y su nota a pie de página dice que los resultados no son comparables con los benchmarks oficiales.

Transcripción traducida

Traducido de la narración original en inglés. El audio y los subtítulos disponibles son controlados por YouTube.

¿Por qué cambió el orden predeterminado?

0:00 Crees que una unión te devuelve las filas en el orden en que las escribiste. Polars 2.0 dejó de prometer eso, por defecto, a propósito. En este video: ¿por qué cambió el valor predeterminado? ¿Qué obtuvo? ¿Y cuál de tus scripts se rompe primero? Este es The Daily Diff, bajo el capó. Polars es una biblioteca de DataFrame de código abierto: un motor de tabla que llamas desde Python,

0:20 con su núcleo escrito en Rust. Es gratuito bajo la licencia MIT, y lo instalas con pip install polars. Un detalle primero. El interruptor que devuelve el orden antiguo es un argumento para la unión misma. Volveré a él al final. Desde 2.0, collect ejecuta el motor de streaming por defecto. El streaming divide la consulta en trozos que se ejecutan en paralelo, y los trozos terminan cuando terminan.

0:42 Para 'join', 'group by' y 'unpivot', la versión no promete un orden. ¿Quién es el primero en ser afectado? Cualquiera que compare la salida con un archivo guardado, fila por fila. Esa prueba puede pasar en tu laptop y fallar en una máquina diferente. A continuación, la guía de migración.

¿Qué promete la guía de migración?

0:57 Dice que el orden exacto de las filas que se muestra arriba no está garantizado. Así que si dependes del orden, clasifica explícitamente. El "out-of-core" también está activado por defecto. Comienza a desbordar al disco aproximadamente al ochenta por ciento de la RAM, con un presupuesto de sesenta y cuatro gigabytes. La clasificación, las funciones de ventana y muchas expresiones pueden desbordarse ahora. Las uniones y los "group-bys" están en camino.

¿Es una lucha justa el benchmark?

1:17 Polars dice que supera a DataFusion y DuckDB en los benchmarks TPC-H y TPC-DS. Los números provienen de sus propias ejecuciones, en datos derivados, y su nota a pie de página dice que no son comparables con los resultados oficiales. Sus propios números dicen que Polars es aproximadamente 3.8 veces más rápido de dieciséis núcleos a ciento noventa y dos, en TPC-H. También dicen que los hilos adicionales de la máquina grande ralentizan las consultas pequeñas.

¿Qué vemos cuando lo ejecutamos?

1:41 Ejecutamos la misma unión dos veces en Polars 2.0.0. La ejecución predeterminada mezcla las filas. Con la bandera, el orden de entrada sobrevive. Encuentra las uniones que alimentan una prueba. Cualquier unión sin una clasificación posterior es una decisión de orden de filas que nunca tomaste. Polars 2.0 es más estricto con los tipos.

¿Significa más estricto más temprano?

1:58 La verificación del esquema detecta una columna faltante antes de que se lea cualquier dato. No puede detectar un 'cast' que falla en una fila, porque ese error espera los datos. Ahora el bucle que abrí.

¿Cómo recupero el orden anterior?

2:08 El interruptor vive en la unión. Configura 'maintain order' en la unión, o agrega una clasificación después de ella. La guía sugiere la clasificación. La bandera de unión mantuvo el orden en nuestra ejecución, manteniendo el orden del lado izquierdo como izquierda, derecha. Veredicto, bajo el capó: NEEDS REVIEW.

¿Cuál es el veredicto?

2:22 Revisaría cada unión antes de actualizar. ¿Tienes alguna pregunta sobre esto? Ponla en los comentarios. Y esa es la diferencia de hoy. Soy Niko de Axrisi. Fusiona con responsabilidad.

Fuentes

  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

Videos relacionados