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