Ответ 1
Короткий ответ:
Чтобы заставить Spark выполнить преобразование, вам понадобится результат. Иногда достаточно простого count
.
TL; DR:
Хорошо, давайте рассмотрим операции RDD
.
RDD
поддерживают два типа операций:
- преобразования - которые создают новый набор данных из существующего.
- действия - которые возвращают значение программе драйвера после выполнения вычисления в наборе данных.
Например, map
- это преобразование, которое передает каждый элемент набора данных через функцию и возвращает новый RDD, представляющий результаты. С другой стороны, reduce
- это действие, которое объединяет все элементы СДР с использованием некоторой функции и возвращает конечный результат в программу драйвера (хотя есть также параллельный reduceByKey
который возвращает распределенный набор данных).
Все преобразования в Spark ленивы, потому что они не вычисляют свои результаты сразу.
Вместо этого они просто запоминают преобразования, примененные к некоторому базовому набору данных (например, к файлу). Преобразования вычисляются только тогда, когда действие требует, чтобы результат был возвращен в программу драйвера. Такой дизайн позволяет Spark работать более эффективно - например, мы можем понять, что набор данных, созданный с помощью карты, будет использоваться для сокращения и возвращать только результат сокращения драйверу, а не больший набор отображаемых данных.
По умолчанию каждый преобразованный RDD
может пересчитываться каждый раз, когда вы выполняете над ним действие. Однако вы также можете сохранить RDD
в памяти, используя метод persist
(или cache
), и в этом случае Spark сохранит элементы в кластере для гораздо более быстрого доступа при следующем запросе. Существует также поддержка сохранения RDD
на диске или репликации на нескольких узлах.
Заключение
Чтобы заставить Spark выполнить вызов карты, вам потребуется результат. Иногда достаточно count
.