Pyspark 基于RDD的py-spark矩阵乘法

Pyspark 基于RDD的py-spark矩阵乘法,pyspark,matrix-multiplication,Pyspark,Matrix Multiplication,我有两个矩阵 # 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

我有两个矩阵

# 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 对于范围内的i(len(X)): #遍历Y列 对于范围内的j(len(Y[0]): #遍历Y行 对于范围内的k(len(Y)): 输出[i][j]+=X[i][k]*Y[k][j] #输出是一个3*4的空矩阵
我不熟悉spark和使用pyspark。

您的代码可以工作,但您应该初始化输出,并且只初始化一次

Output=[[0]*4]*3

如果你不使用RDD,你的老师会不高兴的。

这并不难,你只需要用不同的符号来写矩阵

 X = [[10,7,3],[3 ,2,6],[5 ,8,7]]
可以写成

  X = (0,0,10),(0,1,7),(0,2,3)...
rdd_x=sc.并行化((0,0,10),(0,1,7),(0,2,3)…) rdd_y=sc.并行化((0,0,3)、(0,1,7)、(0,2,11)…)

现在可以使用join或cartesian进行乘法。 例如:


根据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()

在2*2矩阵中,上述代码仅打印(0,0)和(1,1)值。如何获取(0,1)和(1,0)的值
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()