Конструктивно Спарк преобразования ленивы, и вы должны использовать действие для того, чтобы восстановить конкретное значение из них.
Например, следующие преобразования всегда будут оставаться ленивыми:
JavaRDD<String> lines = sc.textFile("data.txt");
JavaRDD<Integer> lineLengths = lines.map(s -> s.length());
функции как map
возвратного РД, и вы можете включить только те РДУ в реальные ценности выполнения действий, такие как reduce
:
int totalLength = lineLengths.reduce((a, b) -> a + b);
Нет знака, который сделает map
, чтобы получить конкретное значение (например, список целых чисел).
Суть заключается в том, что вы можете использовать collect
или любые другие искровые действия для «предотвращений лени» о трансформации:
JavaRDD<String> lines = sc.textFile("data.txt");
JavaRDD<Integer> lineLengths = lines.map(s -> s.length());
List<Integer> collectedLengths = lineLengths.collect()
Помните, однако, использование collect
на большом наборе данных, вероятно, будет очень плохая практика, из-за чего у вашего драйвера закончилась нехватка памяти.
Отличный ответ. Это означает, что мы не могли предотвратить лени от преобразования искры до тех пор, пока не будет вызвано действие. – Souvik
Спасибо, пожалуйста, отметьте его как ответ (зеленый V) – imriqwe