Polars 2.0: なぜ結合でレコードの順序が保持されなくなったのか
Polars 2.0では、デフォルトでストリーミングエンジンでcollectが実行されます。
Polars 2.0では、デフォルトでストリーミングエンジンでcollectが実行されます。結合、group_by、unpivotの場合、maintain_orderまたはsortを明示的に設定しない限り、入力行の順序は保証されなくなりました。polars 2.0.0での実行では、2,000,000行の内部結合はデフォルトで入力順序とは異なる行を返し、maintain_orderを設定すると順序を保持しました。このリリースでは、アウトオブコアスピリングも有効になり、ベンチマークの主張はベンダー自身のものとなっています。
この動画の要点
- 遅延クエリでcollect()を呼び出すと、デフォルトでストリーミングエンジンが使用されます。このエンジンは、join、group_by、unpivotの場合、行の順序を保証しません。
- 移行ガイドには、順序は2.0以前の順序ではなく、保証されないと記載されています。順序に依存する場合は、明示的なソートを推奨しています。
- 私たちの実行では、デフォルトの内部結合は入力順序がFalseを返しました。結合でmaintain_order="left_right"を設定するとTrueを返しました。1台のマシン、1回の実行、1つの結合形状です。
- アウトオブコアスピリングはデフォルトで有効になっています。RAMの約80%で開始され、デフォルトのディスク予算は64GBです。アウトオブコアの結合とgroup_byはロードマップにあります。
- collect_schema()は、データが読み込まれる前に欠落している列を捕捉しますが、1つの値でのみ失敗するキャストはcollect()で失敗します。
- TPC-HとTPC-DSの比較は、ベンダー自身が派生データで実行したものであり、脚注には、結果は公式ベンチマークとは比較できないと記載されています。
翻訳されたトランスクリプト
オリジナルの英語ナレーションから翻訳されています。利用可能なオーディオとキャプションはYouTubeによって管理されています。
なぜデフォルトの順序が変わったのですか?
0:00 結合は、あなたが書いた順序で行を返すと思いますよね。 Polars 2.0は、デフォルトでは意図的にそれを約束しなくなりました。 このビデオでは、なぜデフォルトが変更されたのか? それによって何が得られましたか? そして、どのスクリプトが最初に壊れますか? こちらはThe Daily Diff、舞台裏です。 PolarsはオープンソースのDataFrameライブラリです。 Pythonから呼び出すテーブルエンジンで、
0:20 そのコアはRustで書かれています。 MITライセンスの下で無料であり、pip install polarsでインストールします。 まず、1つの詳細。 古い順序を取り戻すスイッチは、結合自体への引数です。 これについては最後にまた触れます。 2.0以降、collectはデフォルトでストリーミングエンジンを実行します。 ストリーミングはクエリを並列で実行されるチャンクに分割し、 チャンクは終了したときに終了します。
0:42 結合、group by、unpivotの場合、このリリースは順序を約束しません。 誰が最初に影響を受けますか? 出力と保存されたファイルを1行ずつ比較する人です。 そのテストはあなたのラップトップでは合格しても、別のマシンでは失敗する可能性があります。 次に、移行ガイドです。
移行ガイドは何を約束していますか?
0:57 上記の正確な行の順序は保証されないと記載されています。 したがって、順序に依存する場合は、明示的にソートしてください。 アウトオブコアもデフォルトで有効になっています。 RAMの約80パーセントでディスクへのスピルを開始し、 64ギガバイトの予算があります。 ソート、ウィンドウ関数、および多くの式は現在スピルできます。 結合とgroup-byは今後追加されます。
ベンチマークは公平な戦いですか?
1:17 Polarsは、TPC-HおよびTPC-DSベンチマークでDataFusionとDuckDBを上回ると述べています。 これらの数値は、派生データに対する彼ら自身の実行によるものであり、 脚注には、公式結果とは比較できないと記載されています。 彼ら自身の数値によると、PolarsはTPC-Hで16コアから192コアで約3.8倍高速になります。 また、大きなマシンの追加スレッドは小さなクエリを遅くするとも述べています。 Polars 2.0.0で同じ結合を2回実行しました。
実行すると何が見えますか?
1:41 デフォルトの実行では行がシャッフルされます。 フラグを使用すると、入力順序が保持されます。 テストにフィードする結合を見つけてください。 ソートされていない結合は、あなたが決して行わなかった行順序の決定です。 Polars 2.0は型についてより厳密です。 スキーマチェックは、データが読み込まれる前に欠落している列を捕捉します。
厳密であることは早期を意味しますか?
1:58 1行で失敗するキャストは捕捉できません。なぜなら、そのエラーはデータが来るまで待つからです。 さて、私が開いたループです。 スイッチは結合上にあります。
古い順序を取り戻すにはどうすればよいですか?
2:08 結合でmaintain orderを設定するか、その後にソートを追加します。 ガイドはソートを推奨しています。 結合フラグは、私たちの実行では順序を保持し、左側の順序は左、右として保持されました。 舞台裏の評決: NEEDS REVIEW。 アップグレードする前にすべての結合をレビューします。
評決は何ですか?
2:22 これについて質問がありますか? コメントに書いてください。 これで今日の差分は終わりです。 AxrisiのNikoです。 責任を持ってマージしてください。 これはThe Daily Diff、舞台裏です。
情報源
- Release of Polars 2.0Polars (pola.rs)
- Polars 2.0 upgrade guidePolars documentation
- Polars homepagePolars (pola.rs)
- polars-2.0-benchmark repositoryPolars on GitHub
- Release of Polars 2.0 (Hacker News discussion)Hacker News



