我有两个矩阵
# 3x3 matrix
X = [[10,7,3],[3 ,2,6],[5 ,8,7]]
# 3x4 matrix
Y = [[3,7,11,2],[2,7,4,10],[8,7,6,11]]
我想用RDD将这两个乘以spark。有人可以帮我这个。此乘法不应使用任何内置函数。
我能够在python中使用for循环乘以2,如下所示
for i in range(len(X)): # iterate through columns of Y for j in range(len(Y[0])): # iterate through rows of Y for k in range(len(Y)): Output[i][j] += X[i][k] * Y[k][j] #output is a 3*4 empty matrix
我是新来的火花和使用pyspark。
答案 0 :(得分:1)
不是那么难,你只需要用不同的符号来编写矩阵。
X = [[10,7,3],[3 ,2,6],[5 ,8,7]]
可以写成
X = (0,0,10),(0,1,7),(0,2,3)...
rdd_x = sc.parallelize((0,0,10),(0,1,7),(0,2,3)......) rdd_y = sc.parallelize((0,0,3),(0,1,7),(0,2,11)...)
现在你可以使用join或cartesian进行乘法运算。 如,
rdd_x.cartesian(rdd_y)\
.filter(lambda x: x [0][0] == x[1][1] and x[0][1] == x[1][0])\
.map(lambda x: (x[0][0],x[0][2] * x[1][2])).reduceByKey(lambda x,y: x+y).collect()
答案 1 :(得分:0)
您的代码有效,但您应该初始化输出,只能初始化一次,
Output=[[0]*4]*3
你不是在使用RDD,你的老师会不高兴。
答案 2 :(得分:0)
根据 Andrea 的回答,我想出了这个解决方案:
rdd_x.cartesian(rdd_y)\
.filter(lambda x: (x[0][1] == x[1][0]))\
.map(lambda x: ((x[0][0],x[1][1]),x[0][2] * x[1][2])).reduceByKey(lambda x,y: x+y).collect()