0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

集約

グループ化して集約します。

「集約」は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 と agg
  • groupBy、複数の集約、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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. RDD と DataFrame
  2. 変換とアクション
  3. Spark SQL
  4. 集約
← Scala for Backend Engineering & Functional Programmingに戻る