+− THE DAILY DIFFdev & AI news
NEEDS REVIEW

Polars 2.0: чому об'єднання більше не зберігають порядок рядків

Polars 2.0 за замовчуванням запускає collect на потоковому механізмі.

Polars 2.0 за замовчуванням запускає collect на потоковому механізмі. Для join, group_by та unpivot, випуск більше не гарантує порядок вхідних рядків, якщо ви явно не встановите maintain_order або sort. У нашому запуску на polars 2.0.0, внутрішнє об'єднання з 2 000 000 рядків за замовчуванням повертало рядки поза вхідним порядком і зберігало порядок із встановленим maintain_order. Випуск також вмикає вивантаження з пам'яті (out-of-core spilling) і робить заяви про бенчмарки власні для постачальника.

Читати письмову версію (англійською) ↗

Що охоплює це відео

  • Виклик collect() для "лінивого" запиту тепер за замовчуванням використовує потоковий механізм, який не гарантує порядок рядків для join, group_by та unpivot.
  • Посібник з міграції стверджує, що порядок більше не є порядком до версії 2.0 і не гарантується; він рекомендує явне сортування, якщо ви на нього покладаєтеся.
  • У нашому запуску, об'єднання за замовчуванням повернуло False для вхідного порядку; maintain_order="left_right" для об'єднання повернуло True. Одна машина, один запуск, одна форма об'єднання.
  • Вивантаження з пам'яті (out-of-core spilling) увімкнено за замовчуванням: воно починається приблизно з 80% ОЗП, з бюджетом диска за замовчуванням 64 ГБ. Out-of-core join та group_by знаходяться в дорожній карті.
  • collect_schema() виявляє відсутню колонку до того, як будуть прочитані будь-які дані, але приведення типів, яке завершується помилкою лише для одного значення, завершується помилкою лише при collect().
  • Порівняння TPC-H та TPC-DS є власним запуском постачальника на похідних даних, і його виноска говорить, що результати не порівнянні з офіційними бенчмарками.

Перекладена стенограма

Перекладено з оригінальної англійської розповіді. Доступне аудіо та субтитри контролюються YouTube.

Чому змінився порядок за замовчуванням?

0:00 Ви думаєте, що об'єднання повертає вам рядки в тому порядку, в якому ви їх написали. Polars 2.0 припинив це обіцяти, за замовчуванням, навмисно. У цьому відео: чому змінилася поведінка за замовчуванням? Що це дало? І який з ваших скриптів зламається першим? Це The Daily Diff, за лаштунками. Polars – це бібліотека DataFrame з відкритим кодом: рушій таблиць, який ви викликаєте з Python,

0:20 з ядром, написаним на Rust. Він безкоштовний за ліцензією MIT, і ви встановлюєте його за допомогою pip install polars. Спочатку одна деталь. Перемикач, який повертає старий порядок, є аргументом самого об'єднання. Я повернуся до нього в кінці. Починаючи з 2.0, collect за замовчуванням запускає потоковий механізм. Потоковий механізм розділяє запит на частини, які виконуються паралельно, і частини завершуються, коли вони завершуються.

0:42 Для join, group by та unpivot, випуск не обіцяє порядку. Хто постраждає першим? Той, хто порівнює вихідні дані зі збереженим файлом, рядок за рядком. Цей тест може пройти на вашому ноутбуці і не пройти на іншій машині. Далі, посібник з міграції.

Що обіцяє посібник з міграції?

0:57 Він стверджує, що точний порядок рядків, показаний вище, не гарантується. Отже, якщо ви покладаєтеся на порядок, явно сортуйте. Вивантаження з пам'яті (Out-of-core) також увімкнено за замовчуванням. Воно починає вивантажувати дані на диск приблизно при вісімдесяти відсотках ОЗП, з бюджетом шістдесят чотири гігабайти. Сортування, віконні функції та багато виразів тепер можуть вивантажуватися. Об'єднання та групування вже на підході.

Чи є бенчмарк чесним змаганням?

1:17 Polars стверджує, що він перевершує DataFusion та DuckDB в бенчмарках TPC-H та TPC-DS. Числа походять з їхніх власних запусків, на похідних даних, і їхня виноска стверджує, що вони не порівнянні з офіційними результатами. Їхні власні числа говорять, що Polars прискорюється приблизно в три цілих вісім десятих рази з шістнадцяти ядер до ста дев'яноста двох, на TPC-H. Вони також стверджують, що додаткові потоки великої машини уповільнюють невеликі запити.

Що ми бачимо, коли запускаємо його?

1:41 Ми запускали те саме об'єднання двічі на Polars 2.0.0. Запуск за замовчуванням перемішує рядки. З прапорцем вхідний порядок зберігається. Знайдіть об'єднання, які подають дані для тесту. Будь-яке об'єднання без сортування після нього є рішенням щодо порядку рядків, яке ви ніколи не приймали. Polars 2.0 є суворішим щодо типів.

Чи означає суворіше раніше?

1:58 Перевірка схеми виявляє відсутню колонку до того, як будуть прочитані будь-які дані. Він не може виявити приведення типів, яке завершується помилкою на одному рядку, тому що ця помилка чекає на дані. Тепер цикл, який я відкрив.

Як повернути старий порядок?

2:08 Перемикач знаходиться на об'єднанні. Встановіть maintain_order на об'єднанні або додайте сортування після нього. Посібник пропонує сортування. Прапорець об'єднання зберіг порядок у нашому запуску, при цьому порядок лівої сторони зберігається як left, right. Вердикт, за лаштунками: NEEDS REVIEW.

Який вердикт?

2:22 Я б переглянув кожне об'єднання перед оновленням. Є питання щодо цього? Залиште його в коментарях. І це дифф на сьогодні. Я Ніко з Axrisi. Об'єднуйте відповідально.

Джерела

  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

Пов'язані відео

daily · uk · 7 жовт. 2026 р.

Hono обмежує зовнішні запити на витяги, оскільки розробники переглядають отримання внесків

Hono відключив створення зовнішніх запитів на витяги, зберігши код під ліцензією MIT. Сіндре Сорхус окремо пояснив свої власні обмеження репозиторію штучним інтелектом і заявив, що підтримка та обробк

5:22 ↗
daily · uk · 1 жовт. 2026 р.

Gemini 4 Argon — найкраща модель Google. Ви поки що не можете її використовувати.

Google анонсувала Gemini 4 Argon, свою нову передову модель, і тільки довірені кіберзахисники можуть її використовувати. Ось що показує власна 19-рядкова таблиця тестів Google, що виміряв незалежний л

4:53 ↗