【问题标题】:Spark Matrix multiplication with pythonSpark矩阵乘法与python
【发布时间】:2016-10-12 11:34:54
【问题描述】:

我正在尝试使用 Apache Spark 和 Python 进行矩阵乘法。

这是我的数据

from pyspark.mllib.linalg.distributed import RowMatrix

我的向量 RDD

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

我的maxtrix

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

我想做这样的事情:

mat = mat1 * mat2

我写了一个函数来处理矩阵乘法,但恐怕处理时间很长。这是我的功能:

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 

我的函数产生了很多火花动作(采取、收集等)。该功能是否会花费大量处理时间? 如果有人有其他想法,那将对我有所帮助。

【问题讨论】:

    标签: apache-spark pyspark apache-spark-mllib


    【解决方案1】:

    你不能。由于RowMatrix 没有有意义的行索引,它不能用于乘法。即使忽略了唯一的分布式矩阵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))
    

    【讨论】:

    • 感谢您的回答。但这对我不起作用。我正在使用 Spark 1.5.0。这是错误消息:AttributeError: 'BlockMatrix' object has no attribute 'multiply'
    • 1.6已经引入。
    • 好的,我明白了。我创建了一个函数来处理它(见上面的帖子)。
    • 我收到了SparkException: Job aborted due to stage failure 在线rdd.zipWithIndex().map(lambda xi: IndexedRow(xi[1], xi[0]))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多