Spark:使用来自同一RDD的其他元素映射RDD的元素

时间:2015-12-17 14:53:29

标签: scala apache-spark rdd

假设我有一个这个rdd:

val r = sc.parallelize(Array(1,4,2,3))

我想要做的是创建一个映射。 e.g:

r.map(val => val + func(all other elements in r)).

这甚至可能吗?

3 个答案:

答案 0 :(得分:0)

您很可能会遇到异常,例如:波纹管。

rdd = sc.parallelize(range(100))
rdd = rdd.map(lambda x: x + sum(rdd.collect()))

即。你正试图广播RDD

  

例外:您似乎正在尝试广播RDD或   引用动作或转换中的RDD。 RDD转换   并且操作只能由驱动程序调用,而不能在其他内部调用   变换;例如,rdd1.map(lambda x:rdd2.values.count()*   x)因为值转换和计数动作无效   无法在rdd1.map转换中执行。更多   信息,请参阅SPARK-5063。

要实现这一目标,你必须做这样的事情:

res = sc.broadcast(rdd.reduce(lambda a,b: a + b))
rdd = rdd.map(lambda x: x + res.value)

答案 1 :(得分:0)

Spark已经支持Gradient Descent。也许你可以看看他们是如何实现它的。

答案 2 :(得分:0)

我不知道是否有更有效的替代方案,但我会首先创建一些结构,如:

rdd = sc.parallelize([ (1, [4,2,3]), (4, [1,2,3]), (2, [1,4,3]), (3, [1,4,2]));
rdd = rdd.map(lambda (x,y) => x + func(y));