Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在单独的文件中访问用户定义函数(udf)中的广播变量_Python_Apache Spark_Pyspark_User Defined Functions_Broadcast - Fatal编程技术网

Python 在单独的文件中访问用户定义函数(udf)中的广播变量

Python 在单独的文件中访问用户定义函数(udf)中的广播变量,python,apache-spark,pyspark,user-defined-functions,broadcast,Python,Apache Spark,Pyspark,User Defined Functions,Broadcast,我在一个单独的py文件中设置了广播变量,然后将其导入包含我的udf的文件中。但是当我尝试在UDF中使用这个变量时,我发现广播变量在一些Dataframe转换函数的作用域中使用时没有初始化(NoneType)。这是支持代码 广播模型位于utils.py中,定义如下: class Broadcaster(object): _map = {} _bv = None @staticmethod def set_item(k, v): Broadcaste

我在一个单独的py文件中设置了广播变量,然后将其导入包含我的udf的文件中。但是当我尝试在UDF中使用这个变量时,我发现广播变量在一些
Dataframe
转换函数的作用域中使用时没有初始化(NoneType)。这是支持代码

广播模型位于
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)
,然后最终调用
broadcast.broadcast(sc)
,工作正常。但是现在,我想在UDF中使用这个广播变量,它位于一个单独的文件中(比如
udfs.py
)。请注意,这些UDF用于my
Dataframe
处理。下面是一个UDF示例

def my_udf(col):
    bv = Broadcaster._bv.value    #this throws exception :-(
    #more code
在我的
udfs.py
文件中,访问
Broadcaster.\u bv.value
没有问题。只是当在udf中使用并且从
Dataframe
中调用此udf时,我得到的
NoneType
没有
异常。工作节点基本上无法访问广播变量。为什么不能在交叉文件中使用广播变量?我见过一些例子,人们在同一个文件中定义udf,其中存在广播变量,并且它似乎工作得很好。但是由于代码量太大,我需要将它们放在单独的文件中。我有什么选择

编辑:我不想序列化对象,在调用期间将其传递给UDF,并在UDF中反序列化。我认为这违背了广播变量的目的