2017-03-19 240 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