注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Python の経験がある方は、手続き型または命令型の方法でデータを操作することに慣れているかもしれません。つまり、データをある状態から別の状態に変換するために必要な手順を具体的に指定する方法です。一方、SQL は宣言型です。求める結果を記述すると、ソフトウェアがその結果を生成します。PySpark は、Python で複雑な SQL クエリを手軽に組み立てるためのライブラリです。Python の手続き型の構文で SQL の概念を扱えるようにすることを目指しています。これにより、Python の柔軟性、SQL の利便性、Spark の並列処理能力を活用できます。
データセットを全体として捉え、行ではなく列に基づいてデータを処理するように考え方を変えると役立ちます。変数、リスト、辞書、ループなどを使ってデータを直接操作するのではなく、DataFrame を使って処理します。つまり、Python のプリミティブや演算子の代わりに、DataFrame に対して分散方式で大規模な処理を行う Spark の組み込み演算子を使います。
Python に数値のリストがあり、それぞれに 5 を加えたいとします。
Copied!1 2 3 4 5 6 7old_list = [1,2,3] new_list = [] for i in old_list: added_number = i + 5 new_list.append(added_number) print new_list >>> [6,7,8]
PySpark では、次のようになります。
Copied!1new_dataframe = old_dataframe.withColumn('added_number', old_dataframe.number + 5)
この時点で、new_dataframe は次の内容を表します。
| number | added_number |
|---|---|
| 1 | 6 |
| 2 | 7 |
| 3 | 8 |
興味深いことに、DataFrame オブジェクト自体は、実際にはメモリー内にデータを保持していません。Spark 内のデータへの参照です。DataFrame は遅延評価されます。Spark に DataFrame に対する実際の処理(たとえば、Foundry への書き出し)を要求すると、作成した中間の DataFrame をすべてたどり、最適化されたクエリプランを生成して、Spark クラスター上で実行します。これにより、Foundry は単一のサーバーやノートパソコンのメモリーに収まる量を超えるデータも扱えます。
PySpark の組み込み関数でロジックを表現できない場合は、ユーザー定義関数 (UDF) を使います。UDF は PySpark のネイティブ関数より低速なため、必要な場合にのみ使ってください。