集約
グループ化して集約します。
「集約」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
なぜ集約するのか
集約は、多数の行を少数の行に要約します。たとえば、合計、平均、グループごとの件数などです。Spark ではワイド演算であり、クラスター全体でデータがシャッフルされる場合があります。
グローバル集約
agg と count、sum、avg、min、max などの関数を使い、DataFrame 全体に対する 1 つの集計結果を計算します。
import org.apache.spark.sql.functions._
df.agg(
count("*").as("rows"),
avg("age").as("avg_age")
).show()groupBy
groupBy は 1 つ以上の列で行をパーティション分割し、集約に使用できる RelationalGroupedDataset を生成します。
import org.apache.spark.sql.functions._
val byCity = df.groupBy("city").agg(count("*").as("people"))
byCity.show()複数の集約
agg に複数の集約式を渡すと、1 回の処理でグループごとに複数の集計結果を計算できます。
import org.apache.spark.sql.functions._
df.groupBy("department").agg(
sum("salary").as("total"),
avg("salary").as("avg"),
max("salary").as("top")
).show()個別値のカウント
countDistinct を使うと一意な値を数えられます。非常に大規模なデータセットでは、より高速な概算値を得るために approx_count_distinct を使用できます。
import org.apache.spark.sql.functions._
df.agg(countDistinct("city").as("unique_cities")).show()having によるグループのフィルタリング
SQL では、HAVING で集約したグループをフィルタリングします。DSL では、agg の後に計算された列に対して filter を適用します。
import org.apache.spark.sql.functions._
df.groupBy("city")
.agg(count("*").as("n"))
.filter(col("n") > 100)
.show()SQL での集約
登録済みのビューに対して SQL クエリを実行し、GROUP BY と HAVING を使う、同じロジックの例です。
df.createOrReplaceTempView("people")
spark.sql(
"SELECT city, COUNT(*) AS n FROM people GROUP BY city HAVING COUNT(*) > 100"
).show()ピボットテーブル
pivot は列の個別の値を別々の列に変換します。地域別・四半期別の売上など、クロス集計に便利です。
import org.apache.spark.sql.functions._
sales.groupBy("region")
.pivot("quarter")
.agg(sum("amount"))
.show()ウィンドウ関数
ウィンドウ関数は、行を集約してグループごとに 1 行にまとめることなく、スライドするフレームに対して集計します。累計やランキングに最適です。
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._
val w = Window.partitionBy("dept").orderBy(col("salary").desc)
df.withColumn("rank", rank().over(w)).show()RDD の集約
RDD レベルでは、aggregateByKey と reduceByKey によって、カスタムロジックとローカルでの事前結合を使い、キーごとに値を効率よく結合できます。
val pairs = sc.parallelize(Seq(("a", 10), ("a", 20), ("b", 5)))
val sums = pairs.reduceByKey(_ + _)
// (a, 30), (b, 5)単純な Scala による groupBy
自己完結型の類似例です。Scala のコレクションに対する groupBy と mapValues によって、Spark のグループ化と集約を再現します。
object Main {
def main(args: Array[String]): Unit = {
val data = Seq(("a", 10), ("a", 20), ("b", 5))
val sums = data.groupBy(_._1).map { case (k, v) => k -> v.map(_._2).sum }
sums.toSeq.sortBy(_._1).foreach { case (k, s) => println(s"$k: $s") }
}
}理解度チェック
行をグループごとに 1 行へまとめることなく、行のフレームに対して集約する機能はどれですか?
まとめ
Spark でデータを集約する方法を学びました:
count、sum、avg、min、maxとagggroupBy、複数の集約、havingによるフィルタリングpivotとウィンドウ関数- RDD の
reduceByKey/aggregateByKey
Apache Spark コースを修了しました。
よくある質問
「集約」レッスンは無料ですか?
はい。「集約」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「集約」で何を学びますか?
グループ化して集約します。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「集約」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。