rdd.first()
не должен сканировать весь раздел. Получает только первый
пункт и возвращает его.
rdd.collect()
должен просканировать весь раздел, собрать все и отправить
все это обратно (сериализация + затраты на десериализацию и т. д.)
Причина (см. Форум apache-spark-developers) скорее всего потому, что first () полностью выполняется на драйвере
узел в том же процессе, в то время как collect
() должен соединиться с работником
узлы.
Обычно при первом запуске действия большая часть кода JVM не
оптимизирован, и загрузчик классов также должен загрузить много вещей на
летать. Необходимость соединения с другими процессами через RPC может замедлить первый
казнь в сборе.
Тем не менее, если вы запустите это несколько раз (в одной и той же программе драйвера) и
все еще намного медленнее, вы должны посмотреть на другие факторы, такие как сеть
перегрузка, загрузка процессора / памяти на рабочих и т. д.