假设我有两个Numpy数组:
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 :(得分:3)
使用此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)