2016-06-11 36 views
5

我正在嘗試使用Apache Spark和Python進行矩陣乘法。python的火花矩陣乘法

這裏是我的數據

from pyspark.mllib.linalg.distributed import RowMatrix 

我的矢量

rows_1 = sc.parallelize([[1, 2], [4, 5], [7, 8]]) 
rows_2 = sc.parallelize([[1, 2], [4, 5]]) 

我maxtrix的RDD

mat1 = RowMatrix(rows_1) 
mat2 = RowMatrix(rows_2) 

我願做這樣的事情:

mat = mat1 * mat2 

我寫了一個函數來處理矩陣乘法,但我恐怕有一個很長的處理時間。這裏是我的功能:

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 

我的功能做了很多火花動作(take,collect等)。該功能是否需要大量的處理時間? 如果有人有另一個想法,它會對我有幫助。

回答

8

你不能。由於RowMatrix沒有有意義的行索引,因此不能用於乘法。即使忽略唯一分佈式矩陣which supports multiplication with another distributed structureBlockMatrix

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)) 
+1

謝謝您的回答。但它不適合我。我正在使用Spark 1.5.0。以下是錯誤消息:** AttributeError:'BlockMatrix'對象沒有屬性'multiply'** – Raouf

+1

它已在1.6中引入。 – zero323

+1

好的,我明白了。我創建了一個函數來處理它(請參閱上面的帖子)。 – Raouf