#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. Я считаю, что это противоречит назначению широковещательной переменной.