# 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/zh-CN/video/polars-2-row-order/

## 本视频涵盖的内容

- 现在，在惰性查询上调用 collect() 默认使用流式引擎，该引擎不保证 join、group\_by 和 unpivot 的行序。
- 迁移指南指出，行序不再是 2.0 之前的顺序，并且不作保证；如果依赖于此，建议进行显式排序。
- 在我们的运行中，默认的内连接返回的输入顺序为 False；在连接上设置 maintain\_order="left\_right" 后返回 True。一台机器，一次运行，一个连接形状。
- 核外溢出默认开启：在大约 80% 的 RAM 使用量时开始溢出到磁盘，默认磁盘预算为 64 GB。核外 join 和 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 它说上面显示的精确行序不作保证。 因此，如果你依赖于顺序，请明确排序。 核外溢出也默认开启。 它在大约 80% 的 RAM 使用量时开始溢出到磁盘， 预算为 64 GB。 排序、窗口函数和许多表达式现在都可以溢出。 连接和分组即将推出。

### 基准测试公平吗？

1:17 Polars 声称在 TPC-H 和 TPC-DS 基准测试中击败了 DataFusion 和 DuckDB。这些数据来自他们自己在衍生数据上的运行， 他们的脚注指出这些结果不能与官方结果相比较。 他们自己的数据显示，在 TPC-H 上，Polars 从 16 核到 192 核，速度大约快了 3.8 倍。 他们还说，大型机器的额外线程会减慢小型查询。

### 我们运行时看到了什么？

1:41 我们在 Polars 2.0.0 上两次运行了相同的连接。 默认运行会打乱行。 带有标志时，输入顺序得以保留。 找到为测试提供数据的连接。 任何之后没有排序的连接都是你从未做出的行序决定。 Polars 2.0 对类型更加严格。

### 更严格意味着更早？

1:58 模式检查在读取任何数据之前捕获缺失的列。 它无法捕获在一个行上失败的类型转换，因为该错误等待 数据。现在我打开的循环。

### 如何恢复旧顺序？

2:08 开关位于连接上。 在连接上设置 maintain\_order，或者在其后添加一个排序。 指南建议排序。 在我们的运行中，连接标志保留了顺序，左侧的顺序保留为 左、右。幕后判决：NEEDS REVIEW。

### 结论是什么？

2:22 我会在升级之前检查每个连接。 对此有什么疑问吗？ 请在评论中提出。 这就是今天的差异。 我是 Axrisi 的 Niko。 负责任地合并。

## 来源

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