データ ファイルをパーティション分割する

完了

パーティション分割は、spark がワーカー ノード全体のパフォーマンスを最大化できるようにする最適化手法です。 不要なディスク IO を排除して、クエリ内のデータをフィルター処理すると、パフォーマンスがより一層向上します。

出力ファイルをパーティション分割する

データフレームをパーティション分割されたファイルのセットとして保存するには、データの書き込み時に partitionBy メソッドを使用します。

次の例では、派生 Year フィールドを作成します。 次に、それを使用してデータをパーティション分割します。

from pyspark.sql.functions import year, col

# Load source data
df = spark.read.csv('/orders/*.csv', header=True, inferSchema=True)

# Add Year column
dated_df = df.withColumn("Year", year(col("OrderDate")))

# Partition by year
dated_df.write.partitionBy("Year").mode("overwrite").parquet("/data")

データフレームのパーティション分割時に生成されるフォルダー名には、次に示すように、パーティション分割列の名前と値が column=value 形式で含まれます。

パーティション分割されたファイル フォルダー構造を表す図。

データは複数の列でパーティション分割できます。これにより、パーティション キーごとにフォルダーの階層が作成されます。 たとえば、例の順序を年と月でパーティション分割して、フォルダー階層に各年の値のフォルダーが含まれ、さらに各月の値のサブフォルダーが含まれるようにすることができます。

クエリで Parquet ファイルをフィルター処理する

Parquet ファイルからデータフレームにデータを読み取るときに、階層フォルダー内の任意のフォルダーからデータをプルできます。 このフィルター処理は、パーティション分割されたフィールドに対して明示的な値とワイルドカードを使用して行われます。

次の例では、以下のコードは、2020年に発注された受注を取得します。

orders_2020 = spark.read.parquet('/partitioned_data/Year=2020')
display(orders_2020.limit(5))

ファイル パスで指定されたパーティション分割列は、結果のデータフレームでは省略されます。 この例のクエリによって生成された結果には、Year 列は含まれません。すべての行は 2020 からになります。