UDF может быть передано PySpark двумя способами.
- UDF может быть определен в Scala и запущен с использованием PySpark
- UDF может быть определен в Python и запущен PySpark
В первом случае UDF будет работать как часть самой JVM Executor, поскольку сам UDF определен в Scala.Нет необходимости создавать процесс Python.
Во втором случае для каждого исполнителя будет запущен процесс Python.данные будут сериализованы и десериализованы между исполнителем и python для обработки.Это приводит к значительному снижению производительности и накладным расходам при работе с искрой.
обычно предпочтительнее использовать UDF на основе Scala, так как они обеспечат вам лучшую производительность.
в spark 2.x Существуетчто-то под названием Pandas Udf (векторизованный UDF).Они реализованы с использованием Pandas (Преобразование Dataframe с помощью стрелки Apache).По сути, вы пишете код на python, но этот код преобразуется и запускается с использованием панд.что значительно улучшает производительность UDF в python.Надеюсь, это поможет.