PySpark RDD稀疏矩阵乘法从scala到python

时间:2017-08-25 12:35:29

标签: python scala pyspark matrix-multiplication google-cloud-dataproc

我之前发布了一个关于坐标矩阵乘法的问题,有900万行和85K列。 Errors for block matrix multiplification in Spark

但是,我在DataProc上遇到了Out of Memory问题。我试图配置具有高内存核心的集群,但没有运气。

我正在阅读这篇文章并认为它可能有助于我的情况: https://www.balabit.com/blog/scalable-sparse-matrix-multiplication-in-apache-spark/ 但是,他们提供的解决方案是Scala,我不熟悉。有人可以将这段代码翻译成python吗?非常感谢!

def coordinateMatrixMultiply(leftMatrix: CoordinateMatrix, rightMatrix: CoordinateMatrix): 
    CoordinateMatrix = {
    val M_ = leftMatrix.entries.map({ case MatrixEntry(i, j, v) => (j, (i, v)) })
    val N_ = rightMatrix.entries.map({ case MatrixEntry(j, k, w) => (j, (k, w)) })

    val productEntries = M_
    .join(N_)
    .map({ case (_, ((i, v), (k, w))) => ((i, k), (v * w)) })
    .reduceByKey(_ + _)
    .map({ case ((i, k), sum) => MatrixEntry(i, k, sum) })

    new CoordinateMatrix(productEntries)
}

2 个答案:

答案 0 :(得分:0)

快速,只需在插入之前转换为rdd。

 def coordinateMatrixMultiply(leftmatrix, rightmatrix):
        left = leftmatrix.map(lambda (i, j, v): (j, (i, v)))
        right = rightmatrix.map(lambda (j, k, w): (j, (k, w)))
        productEntries = left   \
                        .join(right)    \
                        .map(lambda (x, ((i, v), (k, w))): ((i, k), (v * w)))   \
                        .reduceByKey(lambda x,y: x+y)   \
                        .map(lambda ((i, k), sum): (i, k, sum))
        return productEntries

答案 1 :(得分:0)

Python 3.x的实现

  1. 由于在Python 3中SetWindowLong(window, GWL_USERDATA, (LONG)ptr); // Not going to work on 64bit SetWindowLong(window, GWL_USERDATA, (uintptr_t)ptr); // Still not going to work SetWindowLongPtr(window, GWL_USERDATA, (LONG_PTR)ptr); // works on 32bit and 64bit 函数中没有元组解包,因此我们必须通过单个变量lambda来引用MatrixEntry
  2. 此外,e不可索引,因此我们必须调用各个属性MatrixEntryij
value