Доступ к широковещательным переменным в определяемой пользователем функции (udf) в отдельных файлах

#python #apache-spark #pyspark #user-defined-functions #broadcast

#python #apache-искра #pyspark #определяемые пользователем функции #широковещательный #apache-spark

Вопрос:

У меня есть настройка широковещательной переменной в отдельном файле py, и затем я импортирую то же самое в файл, содержащий мои UDFS. Но когда я пытаюсь использовать эту переменную в UDF, я вижу, что широковещательная переменная не инициализируется (NoneType) при использовании в области некоторой Dataframe функции преобразования. Вот вспомогательный код.

Модель широковещательной передачи находится в utils.py и определяется следующим образом,

 class Broadcaster(object):
    _map = {}
    _bv = None

    @staticmethod
    def set_item(k, v):
        Broadcaster._map[k] = v

    @staticmethod
    def broadcast(sc):
        Broadcaster._bv = sc.broadcast(Broadcaster._map)

    @staticmethod
    def get_item(k):
        val = Broadcaster._bv.value
        return val.get(k)
  

Причина этого заключается в предоставлении интерфейса, в котором перед трансляцией можно задать несколько комбинаций k, v. Что означает, что по моему main.py , теперь я могу вызывать Broadcaster.set_item(k, v) несколько раз, а затем в конечном итоге вызывать Broadcaster.broadcast(sc) , который работает нормально. Но теперь я хочу использовать эту широковещательную переменную в UDF, которая находится в отдельном файле (скажем udfs.py ). Обратите внимание, что эти UDF используются в моей Dataframe обработке. Ниже приведен пример UDF,

 def my_udf(col):
    bv = Broadcaster._bv.value    #this throws exception :-(
    #more code
  

В моем udfs.py файле у меня нет проблем с доступом Broadcaster._bv.value . Только то, что при использовании в udf и когда этот udf вызывается изнутри Dataframe , я получаю, NoneType не имеет value исключения. В основном рабочие узлы не могут получить доступ к широковещательной переменной. Почему я не могу использовать широковещательную переменную в перекрестных файлах? Я видел примеры, когда люди определяют udf в том же файле, где присутствует широковещательная переменная, и, похоже, она работает нормально. Но мне нужно иметь их в отдельных файлах из-за объема кода. Какие у меня есть варианты?

РЕДАКТИРОВАТЬ: я не хочу сериализовать объект, передавать его в UDF во время вызова и де-сериализовать в UDF. Я считаю, что это противоречит назначению широковещательной переменной.