Как я могу заставить Spark выполнять код?

Как я могу заставить Spark выполнить вызов для сопоставления, даже если он считает, что его не нужно выполнять из-за его ленивой оценки?

Я попытался поместить cache() с вызовом карты, но это все еще не делает трюк. Мой метод карты фактически загружает результаты в HDFS. Итак, это не бесполезно, но Spark думает, что это так.

Ответы

Ответ 1

Короткий ответ:

Чтобы заставить Spark выполнить преобразование, вам понадобится результат. Иногда достаточно простого count.

TL; DR:

Хорошо, давайте рассмотрим операции RDD.

RDD поддерживают два типа операций:

  • преобразования - которые создают новый набор данных из существующего.
  • действия - которые возвращают значение программе драйвера после выполнения вычисления в наборе данных.

Например, map - это преобразование, которое передает каждый элемент набора данных через функцию и возвращает новый RDD, представляющий результаты. С другой стороны, reduce - это действие, которое объединяет все элементы СДР с использованием некоторой функции и возвращает конечный результат в программу драйвера (хотя есть также параллельный reduceByKey который возвращает распределенный набор данных).

Все преобразования в Spark ленивы, потому что они не вычисляют свои результаты сразу.

Вместо этого они просто запоминают преобразования, примененные к некоторому базовому набору данных (например, к файлу). Преобразования вычисляются только тогда, когда действие требует, чтобы результат был возвращен в программу драйвера. Такой дизайн позволяет Spark работать более эффективно - например, мы можем понять, что набор данных, созданный с помощью карты, будет использоваться для сокращения и возвращать только результат сокращения драйверу, а не больший набор отображаемых данных.

По умолчанию каждый преобразованный RDD может пересчитываться каждый раз, когда вы выполняете над ним действие. Однако вы также можете сохранить RDD в памяти, используя метод persist (или cache), и в этом случае Spark сохранит элементы в кластере для гораздо более быстрого доступа при следующем запросе. Существует также поддержка сохранения RDD на диске или репликации на нескольких узлах.

Заключение

Чтобы заставить Spark выполнить вызов карты, вам потребуется результат. Иногда достаточно count.

Ссылка

Ответ 2

Spark transformations описывает только то, что нужно сделать. Чтобы вызвать выполнение, вам понадобится action.

В вашем случае есть более глубокая проблема. Если целью является создание какого-то побочного эффекта, например сохранение данных на HDFS, правильный способ использования - foreach. Это действие и имеет чистую семантику. Что также важно, в отличие от map, это не подразумевает ссылочной прозрачности.