如何用rdd写入全局列表?
{{1}}
当我尝试打印Li时,结果是:[]
我要做的是在转换rdd对象时转换另一个全局侦听器Li1。但是,当我这样做时,我最终总是列出一个空列表。 Li1从未改变过。
答案 0 :(得分:1)
在执行Li
之后将[]
值设置为mapValue
的原因是因为Spark序列化了Fn
函数(以及它引用的所有全局变量 - 它被称为闭包)并发送给另一台机器 - 工人。
但是没有完全相应的机制来发送带有闭包的结果从工人到驱动程序。
要接收结果,您需要从功能返回并使用take()
或collect()
等操作。但是要小心 - 你不希望发送的数据超出驱动程序内存的数量 - 否则Spark应用程序会抛出内存异常。
此外,您尚未对RDD mapValues
转换执行操作 - 因此在您的示例中没有对工作人员执行任务。
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]