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

Преобразования и действия

Ленивые вычисления

Урок 2 из 413 шагов

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

Два вида операций

Операции Spark делятся на преобразования (создают новый набор данных и выполняются лениво) и действия (запускают вычисление и возвращают результат или записывают вывод).

Ленивая оценка

Преобразования выполняются лениво: они записывают, что нужно сделать, но ничего не запускают. Spark строит направленный ациклический граф (DAG) преобразований и выполняет его только после вызова действия.

map и filter

map преобразует каждый элемент, а filter оставляет элементы, соответствующие предикату. Оба оператора возвращают новые RDD или Dataset и пока не запускают вычисления.

val nums  = sc.parallelize(1 to 10)
val evens = nums.filter(_ % 2 == 0).map(_ * 10)
// nothing computed yet

flatMap

flatMap преобразует каждый элемент в ноль или более результатов и разворачивает их — это классический способ разделить строки на слова.

val lines = sc.parallelize(Seq("hello world", "spark rocks"))
val words = lines.flatMap(_.split(" "))

Распространённые действия

Действия запускают выполнение:

  • collect — передаёт все результаты драйверу
  • count — подсчитывает количество элементов
  • first / take(n) — возвращает примеры строк
  • reduce — сворачивает данные в одно значение
val total = sc.parallelize(1 to 100).reduce(_ + _)
println(total) // 5050 — runs now

Узкие и широкие преобразования

Узкие преобразования (map, filter) не требуют перемещения данных. Широкие преобразования (groupByKey, reduceByKey, join) запускают перемешивание данных по сети.

reduceByKey

Для RDD, содержащих пары «ключ — значение», reduceByKey агрегирует значения для каждого ключа. Он объединяет данные локально до перемешивания, поэтому работает эффективнее, чем groupByKey.

val pairs  = sc.parallelize(Seq(("a", 1), ("b", 1), ("a", 1)))
val counts = pairs.reduceByKey(_ + _)
// (a, 2), (b, 1)

Кэширование

Если набор данных используется в нескольких действиях, cache или persist сохраняет его в памяти, чтобы не вычислять заново при каждом обращении.

val cached = sc.parallelize(1 to 1000).filter(_ % 3 == 0).cache()
println(cached.count())
println(cached.sum())

Преобразования DataFrame

У DataFrame есть собственные отложенные преобразования: select, where, withColumn, orderBy. Такие действия, как show и collect, запускают их выполнение.

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

val adults = df.where(col("age") >= 18)
               .withColumn("adult", lit(true))
adults.show()

Классический подсчёт слов

Каноническое задание для Spark: разделить строки, сопоставить каждому слову единицу и выполнить свёртку по ключу. Только итоговый collect запускает конвейер.

val text   = sc.textFile("book.txt")
val counts = text.flatMap(_.split(" "))
                 .map(w => (w, 1))
                 .reduceByKey(_ + _)
counts.collect().foreach(println)

Простой ленивый аналог на Scala

Самодостаточный аналог на Scala: ленивое представление откладывает работу до принудительного вычисления, отражая разделение преобразований и действий в Spark.

object Main {
  def main(args: Array[String]): Unit = {
    val pipeline = (1 to 10).view.filter(_ % 2 == 0).map(_ * 10) // lazy
    val result = pipeline.toList // forces evaluation (action)
    println(result)
  }
}

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

Когда Spark фактически выполняет цепочку преобразований map и filter?

Итоги

Вы изучили модель выполнения Spark:

  • Преобразования являются ленивыми (map, filter, flatMap, reduceByKey)
  • Действия запускают работу (collect, count, reduce)
  • узкие и широкие операции (перемешивание)
  • cache для повторного использования результатов

Далее: Spark SQL.

Можно начать бесплатно

Изучай Scala с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
39
Уроки
143

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

Урок «Преобразования и действия» бесплатный?

Да — полный текст урока «Преобразования и действия» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 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 структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 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