2016-06-11 32 views
5

Sto provando a fare la moltiplicazione della matrice usando Apache Spark e Python.Spark Matrix moltiplicazione con python

Ecco i miei dati

from pyspark.mllib.linalg.distributed import RowMatrix 

mio RDD di vettori

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

mio maxtrix

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

Vorrei fare qualcosa di simile:

mat = mat1 * mat2 

Ho scritto una funzione per elaborare la moltiplicazione della matrice ma ho paura di avere un lungo tempo di elaborazione. Ecco la mia funzione:

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 

La mia funzione esegue molte azioni di scintilla (prendere, raccogliere, ecc.). La funzione impiegherà molto tempo di elaborazione? Se qualcuno ha un'altra idea sarà utile per me.

risposta

8

Non è possibile. Poiché RowMatrix non ha indici di riga significativi, non può essere utilizzato per le moltiplicazioni. Anche ignorando che l'unica matrice distribuita which supports multiplication with another distributed structure è 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)) 
+1

Grazie per la risposta. Ma non funziona per me. Sto usando Spark 1.5.0. Ecco il messaggio di errore: ** AttributeError: l'oggetto 'BlockMatrix' non ha attributo 'multiply' ** – Raouf

+1

È stato introdotto in 1.6. – zero323

+1

Ok, capisco. Creo una funzione per elaborarla (vedi il post sopra). – Raouf