Spark rdd写在全球列表中

时间:2015-06-15 22:24:46

标签: apache-spark url-rewriting pyspark rdd globalevent

如何用rdd写入全局列表?

{{1}}

当我尝试打印Li时,结果是:[]

我要做的是在转换rdd对象时转换另一个全局侦听器Li1。但是,当我这样做时,我最终总是列出一个空列表。 Li1从未改变过。

1 个答案:

答案 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]