Spark矩阵乘法与python

Rao*_*ouf 5 apache-spark pyspark apache-spark-mllib

我正在尝试使用Apache Spark和Python进行矩阵乘法.

这是我的数据

from pyspark.mllib.linalg.distributed import RowMatrix
Run Code Online (Sandbox Code Playgroud)

我的矢量RDD

rows_1 = sc.parallelize([[1, 2], [4, 5], [7, 8]])
rows_2 = sc.parallelize([[1, 2], [4, 5]])
Run Code Online (Sandbox Code Playgroud)

我的maxtrix

mat1 = RowMatrix(rows_1)
mat2 = RowMatrix(rows_2)
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

mat = mat1 * mat2
Run Code Online (Sandbox Code Playgroud)

我写了一个函数来处理矩阵乘法,但我害怕处理时间很长.这是我的功能:

def matrix_multiply(df1, df2):
    nb_row = df1.count()    
    mat=[]
    for i in range(0, nb_row):
        row=list(df1.filter(df1['index']==i).take(1)[0])
        row_out = []
        for r in range(0, len(row)):
            r_value = 0
            col = df2.select(df2[list_col[r]]).collect()
            col = [list(c)[0] for c in col]
            for c in range(0, len(col)): 
                r_value += row[c] * col[c]
            row_out.append(r_value)            
        mat.append(row_out)
    return mat 
Run Code Online (Sandbox Code Playgroud)

我的功能做了很多火花动作(采取,收集等).该功能是否需要大量处理时间?如果有人有另一个想法,那对我有帮助.

zer*_*323 9

你不能.由于RowMatrix没有有意义的行索引,因此不能用于乘法.即使忽略的唯一分布矩阵,它支持乘法与另一个分布式结构BlockMatrix.

from pyspark.mllib.linalg.distributed import *

def as_block_matrix(rdd, rowsPerBlock=1024, colsPerBlock=1024):
    return IndexedRowMatrix(
        rdd.zipWithIndex().map(lambda xi: IndexedRow(xi[1], xi[0]))
    ).toBlockMatrix(rowsPerBlock, colsPerBlock)

as_block_matrix(rows_1).multiply(as_block_matrix(rows_2))
Run Code Online (Sandbox Code Playgroud)