Apache spark Spark rdd写入全局列表

Apache spark Spark rdd写入全局列表,apache-spark,url-rewriting,pyspark,rdd,globalevent,Apache Spark,Url Rewriting,Pyspark,Rdd,Globalevent,如何使用rdd写入全局列表 Li = [] Fn(list): If list.value == 4: Li.append(1) rdd.mapValues(lambda x:fn(x)) 当我尝试打印Li时,结果是:[] 我试图做的是在转换rdd对象的同时转换另一个全局列表Li1。然而,当我这样做的时候,我最后总是有一个空的列表。Li1永远不会被转换。执行mapValues-后将Li值设置为[]的原因是Spark序列化Fn函数(以及它引用的所

如何使用rdd写入全局列表

 Li = []

 Fn(list):        
    If list.value == 4: 
        Li.append(1)
 rdd.mapValues(lambda x:fn(x))
当我尝试打印Li时,结果是:[]


我试图做的是在转换rdd对象的同时转换另一个全局列表Li1。然而,当我这样做的时候,我最后总是有一个空的列表。Li1永远不会被转换。

执行
mapValue
s-后将
Li
值设置为
[]
的原因是Spark序列化
Fn
函数(以及它引用的所有全局变量-称为闭包)并发送给另一个机器工作者

但并没有完全对应的机制将带有闭包的结果从工作者发送回驱动程序

为了接收结果,您需要从函数返回并使用类似于
take()
collect()
的操作。但要小心——你们不想发回的数据超过司机的内存——否则Spark应用程序会抛出内存不足的异常

此外,您还没有对RDD
mapValues
转换执行操作,因此在您的示例中,没有对worker执行任何任务

rdd = sc.parallelize([(x, x+1) for x in range(2, 5)])

def Fn(value):
    return value*2

Li = rdd.mapValues(lambda x:Fn(x)).collect()

print Li
会导致

[(2, 6), (3, 8), (4, 10)]
电子数据交换 以下是您的问题描述(基于我对您的理解):

L1 = range(20)
rdd = sc.parallelize(L1)

L2 = rdd.filter(lambda x: x % 2==0).collect()

print L2
>>> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]