在PySpark中乘以两个numpy矩阵

时间:2017-03-19 17:45:21

标签: python numpy apache-spark pyspark

假设我有两个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中沿着这些行做某事吗?

非常感谢您的帮助!

1 个答案:

答案 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)