【问题标题】:Convert Matrix to RowMatrix in Apache Spark using Scala使用 Scala 在 Apache Spark 中将矩阵转换为行矩阵
【发布时间】:2015-07-22 02:03:17
【问题描述】:

我真的很想将我的 org.apache.spark.mllib.linalg.Matrix 转换为 org.apache.spark.mllib.linalg.distributed.RowMatrix

我可以这样做:

val xx = X.computeGramianMatrix()  //xx is type org.apache.spark.mllib.linalg.Matrix
val xxs = xx.toString()
val xxr = xxs.split("\n").map(row => row.replace("   "," ").replace("  "," ").replace("  "," ").replace("  "," ").replace(" ",",").split(","))
val xxp = sc.parallelize(xxr)
val xxd = xxp.map(ar => Vectors.dense(ar.map(elm => elm.toDouble)))
val xxrm: RowMatrix = new RowMatrix(xxd)

但是,这真的很恶心,完全是黑客行为。谁能告诉我一个更好的方法?

注意我使用的是 Spark 1.3.0 版

【问题讨论】:

    标签: scala matrix apache-spark distributed


    【解决方案1】:

    我建议您将Matrix 转换为RDD[Vector],稍后您可以自动转换为RowMatrix

    那么,让我们考虑以下示例:

    import org.apache.spark.rdd._
    import org.apache.spark.mllib.linalg._
    
    
    val denseData = Seq(
      Vectors.dense(0.0, 1.0, 2.0),
      Vectors.dense(3.0, 4.0, 5.0),
      Vectors.dense(6.0, 7.0, 8.0),
      Vectors.dense(9.0, 0.0, 1.0)
    )
    
    val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))
    

    我们需要定义一个方法将Matrix 转换为RDD[Vector]

    def matrixToRDD(m: Matrix): RDD[Vector] = {
       val columns = m.toArray.grouped(m.numRows)
       val rows = columns.toSeq.transpose // Skip this if you want a column-major RDD.
       val vectors = rows.map(row => new DenseVector(row.toArray))
       sc.parallelize(vectors)
    }
    

    现在我们可以在主Matrix 上应用该转换:

     import org.apache.spark.mllib.linalg.distributed.RowMatrix
     val rows = matrixToRDD(dm)
     val mat = new RowMatrix(rows)
    

    【讨论】:

      【解决方案2】:

      上面代码中的小修正:我们需要使用 Vectors.dense 而不是new DenseVector

      val vectors = rows.map(row =>  Vectors.dense(row.toArray))
      

      【讨论】:

      • new DenseVector 上使用它是否有特定原因?
      • 我不确定这是怎么回事。这样做的理由是什么?你为什么需要那个?
      猜你喜欢
      • 1970-01-01
      • 2018-12-13
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多