データ分析において、データをグループ化し、特定のカラムに対して集計を行うことは非常に重要です。PySparkでは、groupBy
メソッドを使用してデータをグループ化し、様々な集計関数を使用してデータを集計することができます。この記事では、具体的な例を通じてPySparkのグループ化と集計関数の使い方を詳しく解説します。
目次
1. 基本的なグループ化と集計
まず、基本的なグループ化と集計の方法を紹介します。
サンプルデータの準備
以下のようなサンプルデータを使用します。
from pyspark.sql import SparkSession
# Sparkセッションの作成
spark = SparkSession.builder.appName("GroupByExample").getOrCreate()
# サンプルデータ
data = [("Alice", "Math", 85), ("Alice", "Science", 92),
("Bob", "Math", 78), ("Bob", "Science", 83),
("Cathy", "Math", 95), ("Cathy", "Science", 89)]
columns = ["Name", "Subject", "Score"]
# データフレームの作成
df = spark.createDataFrame(data, schema=columns)
# データフレームの表示
df.show()
+-----+-------+-----+
| Name|Subject|Score|
+-----+-------+-----+
|Alice| Math| 85|
|Alice|Science| 92|
| Bob| Math| 78|
| Bob|Science| 83|
|Cathy| Math| 95|
|Cathy|Science| 89|
+-----+-------+-----+
名前ごとにグループ化し、スコアの平均を計算
# 名前ごとにグループ化し、スコアの平均を計算
df.groupBy("Name").avg("Score").show()
+-----+----------+
| Name|avg(Score)|
+-----+----------+
|Alice| 88.5|
| Bob| 80.5|
|Cathy| 92.0|
+-----+----------+
名前ごとにグループ化し、スコアの合計を計算
# 名前ごとにグループ化し、スコアの合計を計算
df.groupBy("Name").sum("Score").show()
+-----+----------+
| Name|sum(Score)|
+-----+----------+
|Alice| 177|
| Bob| 161|
|Cathy| 184|
+-----+----------+
2. 複数のカラムでのグループ化
複数のカラムでグループ化し、集計を行うことも可能です。例えば、科目ごとの名前別の平均スコアを計算する場合は以下のようにします。
# 名前と科目ごとにグループ化し、スコアの平均を計算
df.groupBy("Name", "Subject").avg("Score").show()
+-----+-------+----------+
| Name|Subject|avg(Score)|
+-----+-------+----------+
|Alice|Science| 92.0|
|Alice| Math| 85.0|
| Bob|Science| 83.0|
| Bob| Math| 78.0|
|Cathy|Science| 89.0|
|Cathy| Math| 95.0|
+-----+-------+----------+
3. 複数の集計関数の使用
一度に複数の集計関数を適用することも可能です。例えば、スコアの合計と平均を同時に計算する場合は以下のようにします。
from pyspark.sql.functions import avg, sum
# 名前ごとにグループ化し、スコアの合計と平均を計算
df.groupBy("Name").agg(sum("Score").alias("TotalScore"), avg("Score").alias("AverageScore")).show()
+-----+----------+------------+
| Name|TotalScore|AverageScore|
+-----+----------+------------+
|Alice| 177| 88.5|
| Bob| 161| 80.5|
|Cathy| 184| 92.0|
+-----+----------+------------+
4. 集計関数の一覧
PySparkには多くの集計関数が用意されています。以下にいくつかの代表的な関数を紹介します。
avg
:平均値を計算sum
:合計値を計算count
:行数を計算max
:最大値を計算min
:最小値を計算
行数の計算
名前ごとの行数を計算します。
# 名前ごとの行数を計算
df.groupBy("Name").count().show()
+-----+-----+
| Name|count|
+-----+-----+
|Alice| 2|
| Bob| 2|
|Cathy| 2|
+-----+-----+
最大値と最小値の計算
名前ごとのスコアの最大値と最小値を計算します。
from pyspark.sql.functions import max, min
# 名前ごとにグループ化し、スコアの最大値と最小値を計算
df.groupBy("Name").agg(max("Score").alias("MaxScore"), min("Score").alias("MinScore")).show()
+-----+--------+--------+
| Name|MaxScore|MinScore|
+-----+--------+--------+
|Alice| 92| 85|
| Bob| 83| 78|
|Cathy| 95| 89|
+-----+--------+--------+
まとめ
この記事では、PySparkにおけるデータフレームのグループ化と集計関数の基本操作を紹介しました。これらの操作を駆使することで、データの分析がより効果的に行えるようになります。