2017-03-19 610 views
0

numpy的矩陣比方說,我有這兩個numpy的數組:乘兩個PySpark

A = np.arange(1024 ** 2, dtype=np.float64).reshape(1024, 1024) 
B = np.arange(1024 ** 2, dtype=np.float64).reshape(1024, 1024) 

,我對其執行以下操作:

np.sum(np.dot(A, B)) 

現在,我希望能夠基本上使用PySpark使用相同的矩陣執行相同的計算,以便使用Spark集羣實現分佈式計算。

有誰知道或有樣本在PySpark中沿着這些線做了些什麼?

非常感謝您的幫助!

+0

似乎相關https://開頭的實驗室。 yodas.com/large-scale-matrix-multiplication-with-pyspark-or-how-to-match-two-large-datasets-of-company-1be4b1b2871e#.u0khat9gy – kennytm

+0

也許,但我很遺憾無法應用該解決方案對我的問題。它似乎使用不同的庫,是一個基於文字/文本的問題。 – user2926603

+0

那麼你的矩陣密集還是稀疏? A和B真的是1024×1024或更大? – kennytm

回答

2

從這個post使用as_block_matrix方法,你可以做以下的(但見@kennytm的評論爲什麼這種方法可以爲更大的矩陣慢):

import numpy as np 
from pyspark.mllib.linalg.distributed import RowMatrix 
A = np.arange(1024 ** 2, dtype=np.float64).reshape(1024, 1024) 
B = np.arange(1024 ** 2, dtype=np.float64).reshape(1024, 1024) 

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) 

matrixA = as_block_matrix(sc.parallelize(A)) 
matrixB = as_block_matrix(sc.parallelize(B)) 
product = matrixA.multiply(matrixB) 
+0

謝謝,效果很好! – user2926603