2015-12-22 2 views
0

Когда я кодировал программу scala в искровом режиме локального режима, код похож на RDD.map(x => function()).collect, на консоли в течение долгого времени нет выхода журнала, и я думаю, что это stucks. Поэтому я изменяю действие collect на count, все исполнение завершено в ближайшее время. Кроме того, на этапе map имеется мало записей, которые должны быть собраны collect, поэтому проблема не может быть вызвана сетевым транс при отправке результата в драйвер.В чем разница между действиями collect и count?

Может ли кто-нибудь знать причину или столкнулся с подобной проблемой?

+0

«count» работает с каждым разделом, а также в исполнителях, когда собирает все данные в драйвер, сохраняет их в памяти драйвера и затем выполняет любые вычисления. В любом случае «собирать» будет намного медленнее, чем «счет». – Sumit

ответ

3

Метод count суммирует количество записей RDD для каждого раздела и возвращает целое число, состоящее из этого числа, следовательно, передача данных минимальна; с другой стороны, метод collect, как указано в его названии, вносит все записи в драйвер в виде List, поэтому, если памяти недостаточно, вы можете получить несколько исключений (поэтому не рекомендуется делать collect, если вы aren ' уверен, что он поместится в вашем драйвере, обычно есть более быстрые альтернативы, такие как take, что также вызывает ленивые преобразования), кроме того, для этого требуется передача гораздо большего количества данных.

+0

'take' запускает задания, и может быть много заданий с учетом данных, т. Е. Количество элементов на раздел. –

Смежные вопросы