# Polars 2.0: почему объединения больше не сохраняют порядок строк

Published: 2026-10-08

Polars 2.0 по умолчанию запускает collect на потоковом движке. Для join, group\_by и unpivot релиз больше не гарантирует порядок строк ввода, если вы явно не установите maintain\_order или sort. В нашем запуске на polars 2.0.0, внутреннее объединение из 2 000 000 строк возвращало строки не в порядке ввода по умолчанию и сохраняло порядок при установленном maintain\_order. Релиз также включает выгрузку данных за пределы оперативной памяти и делает заявления о бенчмарках собственными заявлениями поставщика.

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

## Что освещается в этом видео

- Вызов collect() для ленивого запроса теперь по умолчанию использует потоковый движок, который не гарантирует порядок строк для join, group\_by и unpivot.
- Руководство по миграции говорит, что порядок больше не соответствует порядку до версии 2.0 и не гарантируется; оно рекомендует явную сортировку, если вы на нее полагаетесь.
- В нашем запуске внутреннее объединение по умолчанию возвращало input order False; maintain\_order="left\_right" при объединении возвращало True. Одна машина, один запуск, одна форма объединения.
- Выгрузка данных за пределы оперативной памяти включена по умолчанию: она начинается примерно с 80% оперативной памяти, с бюджетом в 64 ГБ по умолчанию на диске. Объединения и group\_by за пределами оперативной памяти находятся в дорожной карте.
- collect\_schema() перехватывает отсутствующую колонку до того, как будут прочитаны какие-либо данные, но приведение типа, которое завершается с ошибкой только для одного значения, завершается с ошибкой только при collect().
- Сравнение TPC-H и TPC-DS — это собственное тестирование поставщика на производных данных, и его сноска гласит, что результаты не сопоставимы с официальными бенчмарками.

## Главы

- 0:00 Почему изменился порядок по умолчанию?
- 0:56 Что обещает руководство по миграции?
- 1:17 Является ли бенчмарк честным соревнованием?
- 1:41 Что мы видим при его запуске?
- 1:56 Означает ли 'строже' 'раньше'?
- 2:07 Как вернуть старый порядок?
- 2:20 Каков вердикт?

## Переведенная стенограмма

Переведено с оригинального английского повествования. Доступные аудио и субтитры контролируются 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 В нем говорится, что точный порядок строк, показанный выше, не гарантируется. Поэтому, если вы полагаетесь на порядок, явно отсортируйте. Выгрузка данных за пределы оперативной памяти также включена по умолчанию. Она начинает выгружать данные на диск примерно при восьмидесяти процентах оперативной памяти, с бюджетом в шестьдесят четыре гигабайта. Сортировка, оконные функции и многие выражения теперь могут выгружать данные. Объединения и group-by будут добавлены.

### Является ли бенчмарк честным соревнованием?

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 для объединения или добавьте сортировку после него. Руководство предлагает сортировку. Флаг объединения сохранил порядок в нашем запуске, при этом порядок левой стороны сохранился как левая, правая. Вердикт, под капотом: NEEDS REVIEW.

### Каков вердикт?

2:22 Я бы проверил каждое объединение перед обновлением. Есть вопросы по этому поводу? Задайте их в комментариях. И это The Daily Diff на сегодня. Я Нико из Axrisi. Объединяйте ответственно.

## Источники

- [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
