使用RDD在py-spark中进行矩阵乘法

时间:2016-07-04 13:47:08

标签: 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
        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。

3 个答案:

答案 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()