Агрегации
Группируйте и агрегируйте
«Агрегации» — бесплатный урок 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,maxgroupBy, несколько агрегаций и фильтрыhavingpivotи оконные функции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 — локальная установка не требуется.