2016-06-11 30 views
5

Tôi đang cố gắng nhân ma trận bằng cách sử dụng Apache Spark và Python.Phép nhân Spark Matrix với python

Đây là dữ liệu của tôi

from pyspark.mllib.linalg.distributed import RowMatrix 

RDD của tôi về vectơ

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

maxtrix My

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

Tôi muốn làm điều gì đó như thế này:

mat = mat1 * mat2 

Tôi đã viết một hàm để xử lý phép nhân ma trận nhưng tôi sợ phải có thời gian xử lý dài. Đây là chức năng của tôi:

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 

Chức năng của tôi tạo ra nhiều hành động tia lửa (lấy, thu thập, v.v.). Liệu chức năng sẽ mất rất nhiều thời gian xử lý? Nếu ai đó có ý tưởng khác, nó sẽ hữu ích cho tôi.

Trả lời

8

Bạn không thể. Vì RowMatrix không có chỉ mục hàng có nghĩa, nó không thể được sử dụng cho phép nhân. Thậm chí bỏ qua ma trận phân phối duy nhất 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

Cảm ơn câu trả lời của bạn. Nhưng nó không có tác dụng với tôi. Tôi đang sử dụng Spark 1.5.0. Đây là thông báo lỗi: ** AttributeError: đối tượng 'BlockMatrix' không có thuộc tính 'nhân' ** – Raouf

+1

Nó đã được giới thiệu trong 1.6. – zero323

+1

Ok tôi hiểu rồi. Tôi tạo ra một chức năng để xử lý nó (xem bài viết ở trên). – Raouf

Các vấn đề liên quan