Почему после .distinct () всегда есть .collect ()? - PullRequest
0 голосов
/ 28 сентября 2019

Новичок для искры.Часто см. Структуру .distinct (). Collect ().Какова может быть внутренняя причина наличия функции collect () сразу после функции Different ()?

Ответы [ 3 ]

5 голосов
/ 28 сентября 2019

distinct - это трансформация.Это означает, что оно выполняется не сразу, а только при вызове действия.

collect - это действие.Вызов метода collect приводит к выполнению всех предыдущих преобразований.

Внешний вызов Spark, вызывающий distinct после collect, может увеличить объем используемой памяти в вашей программе, поскольку программа будет также создавать дублирующиеся элементы.В Spark вызов distinct после collect также может привести к сбою всей программы.

Дополнительные объяснения можно найти здесь: https://dzone.com/articles/getting-lazy-with-scala

3 голосов
/ 28 сентября 2019

Spark использует концепцию «ленивой оценки».Ленивая оценка означает, что Spark будет ждать до самого последнего момента, чтобы выполнить график инструкций вычисления, обычно, чтобы искать способы улучшить план выполнения.Ленивая оценка включает в себя концепции преобразований и действий.Преобразование (такое как distinct(), sort(), sum()) будет отмечено Spark и встроено в логический план.Этот план называется DAG (направленный ациклический граф).Нам нужно вызвать действие, чтобы Спарк выполнил DAG.Примеры действий включают count(), show() или collect().Действия - это, по сути, все, что возвращает результат наших преобразований данных обратно в нативный объект на соответствующем языке, в данном случае Python.

В нашем примере Spark фактически не выполняет DAG при вызове distinct().Он выполняет DAG, когда вы вызываете действие после отличного, такого как distinct().collect() или distinct().show() или distinct().count().Кроме того, collect() - это просто функция, которая возвращает DataFrame в виде объектов списка строк Python, как указано здесь ... collect().Вы можете выбрать другие действия, которым нужно следовать distinct(), collect() - это просто часто используемый пример в учебных пособиях, поскольку он показывает структуру строки в наборе данных.

0 голосов
/ 29 сентября 2019

Для этого может быть несколько причин.

collect - это действие.Как упоминалось выше, Spark выполняет все операции, ведущие к началу (если кэширование не используется) и возвращает результат при вызове collect.Однако вы видели причину, по которой вы видели distinct до collect, в том, что collect возвращает результаты в программу драйвера и, чтобы ограничить результат, выбирает только отдельные значения и затем возвращает драйверу.Таким образом, будет извлечено меньше записей, и это поможет избежать ошибок OutOfMemory.

Нет другой причины, по которой вы видите эти два метода вместе.Пожалуйста, обратите внимание, что это просто совпадение, что вы видели этих двоих вместе.Я никогда не использовал их вместе ни в одном из своих проектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...