注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

コンピュートエンジンの選択

Python トランスフォームは、さまざまなデータ処理のニーズに対応するために、複数のクエリエンジンをサポートしています。適切なエンジンを選択することで、ユースケースに最適なパフォーマンス、コスト効率、開発者の生産性を確保できます。

利用可能なクエリエンジンは、DuckDB ↗、pandas ↗、Polars ↗、Spark ↗です。これらにはすべて、シンプルで直感的な API でデータを操作できる Python ライブラリがあります。

DuckDB、Pandas、Polars は、lightweight とも呼ばれる標準のシングルノードコンピュートで利用できます。Spark は分散コンピュートに利用できます。詳しくは、PySpark のドキュメントを参照してください。

機能サポートの比較

次のテーブルは、Python トランスフォームのコンピュート方式ごとに、Foundry の機能が利用可能かどうかを示しています。Pipeline Builder のコンピュートエンジンの比較については、パイプラインタイプのサポート比較を参照してください。

1 シングルノードトランスフォームは、stop_propagating と stop_requiring のみをサポートしています。sever_permissions には対応していません。
2 PySpark トランスフォームでは、インクリメンタル出力に書き込まれたデータを、指定したスキーマで読み取ることができます。最初のデータセットトランザクションではスキーマがコミットされないため、これが必要になります。シングルノードトランスフォームでは利用できません。

利用可能なクエリエンジン

Pandas

最適な用途: 迅速な反復開発、探索的分析、小規模なデータセット

Pandas ↗ は、Python エコシステムで広く使われているデータ操作ライブラリーです。迅速なプロトタイピングに優れ、対応するライブラリーの広範なエコシステムを提供します。新しいトランスフォームをはじめるときや、チームが使い慣れたツールで迅速に作業を進める必要があるときは、pandas を使用します。

主な特性:

  • 開発中の即時フィードバック
  • 充実したドキュメントとコミュニティーサポート
  • 時系列処理と統計操作の豊富な機能
  • シングルスレッドの実行モデル

Polars(推奨)

最適な用途: 本番用データパイプラインと中規模のデータ処理

Polars ↗ は、本番用トランスフォームのデフォルトの選択肢とすべきエンジンです。Rust コアを持つ Apache Arrow ベースのエンジンで、列指向ストレージと遅延評価によって優れたパフォーマンスを実現します。Polars は、DataFrame 操作の使いやすさと、本番ワークロードに必要なパフォーマンスを兼ね備えています。

主な特性:

  • 遅延評価による自動クエリ最適化

  • 単一ノードでのマルチスレッド実行

  • メモリー効率の高い列指向ストレージ

  • 予測可能なパフォーマンス特性

  • サポートされている操作では、cudf-polars による GPU アクセラレーションを利用可能 — 詳細については、高度なコンピュートオプションを参照してください

DuckDB

最適な用途: 厳しい低遅延要件のある中規模データ

DuckDB ↗ は、分析ワークロード向けに最適化された、高性能な単一ノードの SQL クエリエンジンです。DuckDB は、低遅延と効率的なリソース使用が求められる中規模から大規模のデータ処理タスクに特に適しています。ただし、DuckDB には Python DataFrame API がなく、データ操作には生の SQL クエリを記述する必要があります。

主な特性:

  • 遅延評価による自動クエリ最適化
  • ディスクへのスピルによる自動メモリー管理
  • DataFrame API ではなく、生の SQL 文字列を処理

Spark

最適な用途: 大規模なデータ処理と組織のデータ基盤

Spark ↗ は、大規模な分散コンピューティング向けに設計されています。小規模な操作ではオーバーヘッドが大きくなりますが、データが単一ノードの容量を超える場合や、最大のスケーラビリティーを必要とする組織の重要なデータセットを構築する場合には、唯一の選択肢です。

主な特性:

  • 複数ノードにわたる分散処理
  • ディスクへのスピルによる自動メモリー管理
  • ペタバイト規模で実証済み
  • 複雑なクエリプランニング向けの Catalyst オプティマイザー

適切なエンジンを選ぶ

以下のサイズに関する推奨値は一般的な目安であり、すべてのクエリに当てはまるわけではありません。トランスフォームの形式が適切であれば、Lightweight エンジンは単一ノードでテラバイト規模の入力も処理できます。Polars ストリーミングの使用方法の詳細については、Polars 遅延 API のドキュメントで、メモリー容量を超えるデータの加工に関する説明を参照してください。すべてのデータを一度にメモリーに読み込む必要がないクエリは、単一ノードで任意のサイズに拡張できます。

本番用トランスフォームでは、デフォルトの選択肢として Polars からはじめることを推奨します。迅速な反復開発や、エコシステム内の特定のライブラリーが必要な場合は、pandas に切り替えられます。DuckDB は、SQL API の利用や単一ノードのパフォーマンスを最大化する場合に優れた選択肢です。Spark に移行するのは、データ規模によって必要となる場合_のみ_にしてください。通常は、データが 50 GB を超え、フィルタープッシュダウンなどの最適化を利用できない場合が該当します。

特性PandasPolarsDuckDBPySpark
最適なデータサイズ(非圧縮)< 1GB1-50GB1-50GB> 50GB
最適な行数*100万行未満100万~2億行100万~2億行2億行超
起動時のオーバーヘッド控え目控え目控え目大きい
メモリー効率低い非常に高い非常に高い高い
構文Python DataFramePython DataFrameSQL**Python DataFrame
処理速度(小規模データ)良好優れている優れている遅い
処理速度(中規模データ)低い優れている優れている速い
処理速度(大規模データ)不適切変動あり変動あり優れている
並列実行なし単一ノード単一ノード分散
メモリースピルなし限定的自動自動

* 各クエリエンジンが処理できる行数は、スキーマによって大きく異なります。これらの数値は、一般的なケースにおけるおおよその目安です。

** オープンソースのアダプターライブラリー(Ibis、SQLFrame)が存在します。

高度なコンピュートオプション

高度な統合には、さまざまなバックエンドに対応する Ibis ↗、Apache DataFusion ↗、DuckDB による生の Parquet ファイルへのアクセス、cuDF ↗ による GPU アクセラレーションを活用した処理があります。

例とガイダンスについては、高度な単一ノードのコンピュートオプションを参照してください。

Spark から単一ノードのコンピュートに移行する

既存のトランスフォームの多くは Spark を使用しています。これは、Python トランスフォームでは単一ノードのエンジンよりも以前から Spark がサポートされているためです。これらのパイプラインの多くは、単一ノードのコンピュートエンジンに移行すると、より速く実行できるか、リソースの消費量を削減できる可能性があります。ただし、移行がどの程度の効果をもたらすかを判断するのは難しく、書き換えには多くのコストがかかる場合があります。単一ノードのパフォーマンスを最初に把握するために、全面的な書き換えを決める前に、SQLFrame を使用してパイプラインを DuckDB に移行することを推奨します。