假设我有一个这个rdd:
val r = sc.parallelize(Array(1,4,2,3))
我想要做的是创建一个映射。 e.g:
r.map(val => val + func(all other elements in r)).
这甚至可能吗?
答案 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));