将RDD中的每个元素与列表中的相应元素相乘

时间:2019-01-05 05:13:49

标签: python apache-spark pyspark rdd

例如:

x = RandomRDDs.normalRDD(sc, size=3, seed=0)

x像这样:[-1.3,-2.4,-4.5] 我想将x的每个元素与列表[1、2、3]中的不同数字相乘,并将它们相加以产生y。 此处y等于-1.3 * 1 + -2.4 * 2 + -4.5 * 3

但是我只能这样做:

y = x.map(lambda i: i*2).reduce(lambda a, b: a+b)

这里y = -1.3 * 2 + -2.4 * 2 + -4.5 * 2

如何每次用不同的数字替换 x.map(lambda i:i * 2)中的2?

最终效果类似于我们在python中经常做的事情:

x = [-1.3, -2.4, -4.5]
w = [1, 2, 3]
y = sum(x*w)

sum([x[i]*w[i] for i in range(len(x))])

非常感谢!

1 个答案:

答案 0 :(得分:1)

我可以使用zipWithIndexmap来做到这一点:

x = RandomRDDs.normalRDD(sc, size=3, seed=0)
w = sc.broadcast([1, 2, 3])

x.zipWithIndex().map(lambda v: v[0] * w.value[v[1]]).sum()

或者,

import operator
x.zipWithIndex().map(lambda v: v[0] * w.value[v[1]]).reduce(operator.add)