Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.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 Pyspark映射调用的函数不修改全局列表_Python_Apache Spark_Lambda_Pyspark_Global Variables - Fatal编程技术网

Python Pyspark映射调用的函数不修改全局列表

Python Pyspark映射调用的函数不修改全局列表,python,apache-spark,lambda,pyspark,global-variables,Python,Apache Spark,Lambda,Pyspark,Global Variables,我已经定义了这个在全局列表签名上运行的函数,我已经测试了这个函数,它可以工作了 def add_to_list_initial(x): global signature signature.append([x]) print(x) return x 打印将检查是否调用了该函数 我必须为Pyspark rdd的每一行运行此函数,因此我编写了以下代码: rdd.map(lambda x: min([str(int.from_bytes(hash_functions[

我已经定义了这个在全局列表签名上运行的函数,我已经测试了这个函数,它可以工作了

def add_to_list_initial(x):
    global signature
    signature.append([x])
    print(x)
    return x
打印将检查是否调用了该函数

我必须为Pyspark rdd的每一行运行此函数,因此我编写了以下代码:

rdd.map(lambda x: min([str(int.from_bytes(hash_functions[0](str(shingle)), 'big')) for shingle in x])).map(lambda x: add_to_list_initial(x))
但是函数没有被调用,所以为了避免map的“惰性”,我尝试在末尾添加“.count()”,方法如下:

rdd.map(lambda x: min([str(int.from_bytes(hash_functions[0](str(shingle)), 'big')) for shingle in x])).map(lambda x: add_to_list_initial(x)).count()
def add_to_list(x):
    global num_announcements
    global signature
    global i
    print(len(signature))
    if i == num_announcements:
        i = 0
    signature[i].append(x)
    print(i)
    i += 1


for function in hash_functions[1:]:
    rdd.map(lambda x: min([str(int.from_bytes(function(str(shingle)), 'big')) for shingle in x])).foreach(add_to_list)
现在打印完成了。我甚至检查了列表签名是否已更新,但当我尝试打印列表大小时,结果将为0,因为列表根本没有更新

我甚至尝试使用foreach而不是map,但结果是一样的:

rdd1 = rdd.map(lambda x: min([str(int.from_bytes(hash_functions[0](str(shingle)), 'big')) for shingle in x]))
rdd1.foreach(add_to_list_initial)
这些是输出的第一行,它们在我的Pycharm控制台上以红色书写,甚至打印:

19/11/19 21:56:51 WARN TaskSetManager: Stage 2 contains a task of very large size (76414 KB). The maximum recommended task size is 100 KB.
1000052032941703168135263382785614272239884872602
1001548144792848500380180424836160638323674923493
1001192257270049214326810337735024900266705408878
1005273115771118475643621392239203192516851021236
100392090499199786517408984837575190060861208673
1001304115299775295352319010425102201971454728176
1009952688729976061710890304226612996334789156125
1001064097828097404652846404629529563217707288121
1001774517560471388799843553771453069473894089066
1001111820875570611167329779043376285257015448116
1001339474866718130058118603277141156508303423308
1003194269601172112216983411469283303300285500716
1003194269601172112216983411469283303300285500716
1003194269601172112216983411469283303300285500716
1003194269601172112216983411469283303300285500716
1003194269601172112216983411469283303300285500716
如何以有效的方式解决问题? 我使用Python3.7和Pyspark 3.2.1

我这样做是为了为每一组散列木瓦获得一个最小散列签名,其中文档的id是

然后,为了计算其他排列,我想这样做:

rdd.map(lambda x: min([str(int.from_bytes(hash_functions[0](str(shingle)), 'big')) for shingle in x])).map(lambda x: add_to_list_initial(x)).count()
def add_to_list(x):
    global num_announcements
    global signature
    global i
    print(len(signature))
    if i == num_announcements:
        i = 0
    signature[i].append(x)
    print(i)
    i += 1


for function in hash_functions[1:]:
    rdd.map(lambda x: min([str(int.from_bytes(function(str(shingle)), 'big')) for shingle in x])).foreach(add_to_list)
但问题是一样的。
我很乐意为我的minhashing问题提供建议,但问题是关于上面描述的问题。

可以使用类(a)而不是全局变量

例如:

from collections.abc导入可调用
类签名(可调用):
定义初始化(自):
self.signature=[]
定义调用(self,x):
self.signature.append([x])
返回x
然后,您可以在需要时实例化此可调用项:

add_to_list_initial=Signature()
map(lambda x:min([str(int.from_字节(散列函数[0](str(shingle)),'big'))表示x中的shingle])).map(
lambda x:将_添加到_列表_首字母(x)
).count()
打印(将\添加到\列表\首字母签名)
注意:此处可以避免lambda表达式,简化为:

rdd.map(lambda x:min([str(int.from_字节(散列函数[0](str(shingle)),'big'))表示x中的shingle]).map(
将\添加到\列表\首字母
).count()
编辑

要允许酸洗,可以使用:

类签名:
定义初始化(自):
self.signature=[]
定义调用(self,x):
self.signature.append([x])
返回x

我以这种方式解决了问题,即使我没有找到解决问题的有效方法

signatures = shingles.flatMap(lambda x: [[(x[1]+1, (x[1]+1)%lsh_b), min([int.from_bytes(function(str(s)), 'big') for s in x[0]])] for function in hash_functions]).cache()

我获得以下错误:>\u pickle.PicklingError:无法序列化对象:TypeError:无法pickle\u abc\u数据对象sok,因此请删除导入(
from collections.abc import Callable
)和继承。使用
类签名:
而不使用超类
可调用的
。同样的问题是,返回一个空列表,但如果我插入打印,它将在每次迭代结束时打印完整列表。我认为这是pyspark的“问题”,因为我不知道如何强制修改self.signature,因为它认为该操作“无用”