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

У меня есть настройка широковещательной переменной в отдельном файле py, и затем я импортирую ее в файл, содержащий мои пользовательские функции.Но когда я пытаюсь использовать эту переменную в 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).Обратите внимание, что эти пользовательские функции используются в моей обработке 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.Я считаю, что побеждает цель трансляции переменной.

...