繁体   English   中英

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

[英]Spark: Mapping elements of an RDD using other elements from the same RDD

假设我有一个rdd:

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

我要做的是创建映射。 例如:

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

这有可能吗?

您很有可能会遇到例外,例如波纹管。

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)

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

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

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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM