Да, в текущей реализации весь код загрузки модели будет выполняться каждый раз при запуске вашей функции, что далеко не оптимально. Невозможно передать его напрямую от драйвера к рабочим узлам, но есть аналогичный способ - инициализировать модель на каждом рабочем узле, но только один раз. Для этого вам придется использовать ленивую функцию, которая будет выполняться только тогда, когда потребуется фактический результат - так, на рабочих.
Попробуйте сделать что-то вроде этого:
# Here we are not loading the model at the loading time, only the worker code
# will invoke this routine and gets the spacy object. Which means we are loading
# new spacy models on every executors.
SPACY_MODEL = None
def get_spacy_model():
global SPACY_MODEL
if not SPACY_MODEL:
_model = spacy.load('en', max_length=6000000)
SPACY_MODEL = _model
return SPACY_MODEL
@udf(returnType=Types.ArrayType(Types.FloatType()))
def generateVectorRepresentation(text):
# TODO: move the load function out if posible, and remove unused modules
# nlp = spacy.load('en', disable=['parser', 'tagger'])
nlp = get_spacy_model()
# your further processing
Я думаю, вы можете попробовать добавить код загрузки перчатки в аналогичную функцию.
Вы можете попробовать прочитать об этом здесь: https://haridas.in/run-spacy-jobs-on-apache-spark.html (это не мой блог, только что нашел эту информацию при попытке проделать то же самое с моделью Spacy).