0Pricing
Scala for Backend Engineering & Functional Programming · Урок

Агрегации

Группируйте и агрегируйте

«Агрегации» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.

Зачем нужна агрегация?

Агрегации объединяют множество строк в меньшее количество: вычисляют итоги, средние значения и количество элементов в каждой группе. В Spark это широкие операции, которые могут перемещать данные по кластеру.

Глобальные агрегаты

Вычисляйте общую сводку для всего DataFrame с помощью agg и таких функций, как count, sum, avg, min, max.

import org.apache.spark.sql.functions._

df.agg(
  count("*").as("rows"),
  avg("age").as("avg_age")
).show()

groupBy

groupBy распределяет строки по одному или нескольким столбцам, создавая RelationalGroupedDataset, готовый к агрегации.

import org.apache.spark.sql.functions._

val byCity = df.groupBy("city").agg(count("*").as("people"))
byCity.show()

Несколько агрегаций

Передайте несколько агрегирующих выражений в agg, чтобы за один проход вычислить сводные показатели для каждой группы.

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 применяйте filter после agg к вычисленному столбцу.

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()

Оконные функции

Оконные функции выполняют агрегацию по скользящему кадру без объединения строк — это идеально подходит для накопительных итогов или ранжирования.

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)

Простой groupBy на Scala

Самодостаточный аналог: groupBy коллекций Scala вместе с 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") }
  }
}

Быстрая проверка

Какая возможность выполняет агрегацию по кадру строк без объединения их в одну строку для каждой группы?

Итоги

Вы выполняли агрегацию данных в Spark:

  • agg с count, sum, avg, min, max
  • groupBy, несколько агрегаций и фильтры having
  • pivot и оконные функции
  • reduceByKey / aggregateByKey для RDD

Вы завершили курс по Apache Spark.

Часто задаваемые вопросы

Урок «Агрегации» бесплатный?

Да — полный текст урока «Агрегации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.

Чему я научусь в уроке «Агрегации»?

Группируйте и агрегируйте Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?

Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Агрегации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?

Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. RDD и DataFrames
  2. Преобразования и действия
  3. Spark SQL
  4. Агрегации
← Назад к Scala for Backend Engineering & Functional Programming