Преобразования и действия
Ленивые вычисления
«Преобразования и действия» — бесплатный урок 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 yetflatMap
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 — локальная установка не требуется.
Все уроки этого курса
- RDD и DataFrames
- Преобразования и действия
- Spark SQL
- Агрегации