【问题标题】:Convert dataframe into Spark mllib matrix in Scala在 Scala 中将数据帧转换为 Spark mllib 矩阵
【发布时间】:2018-12-13 12:33:55
【问题描述】:

我有一个名为 df 的 Spark 数据框作为输入:

+---------------+---+---+---+---+
|Main_CustomerID| A1| A2| A3| A4|
+---------------+---+---+---+---+
|            101|  1|  0|  2|  1|
|            102|  0|  3|  1|  1|
|            103|  2|  1|  0|  0|
+---------------+---+---+---+---+

我需要将A1、A2、A3、A4 的值收集到一个 mllib 矩阵中,例如,

dm: org.apache.spark.mllib.linalg.Matrix =
1.0  0.0  2.0  1.0
0.0  3.0  1.0  1.0
2.0  1.0  0.0  0.0

如何在 Scala 中实现这一点?

【问题讨论】:

    标签: scala apache-spark matrix apache-spark-sql apache-spark-mllib


    【解决方案1】:

    你可以这样做,首先获取应该包含在矩阵中的所有列:

    import org.apache.spark.sql.functions._
    
    val matrixColumns = df.columns.filter(_.startsWith("A")).map(col(_))
    

    然后将数据帧转换为RDD[Vector]。由于向量需要包含双精度数,因此也需要在此处完成此转换。

    import org.apache.spark.mllib.linalg.Vectors
    import org.apache.spark.mllib.linalg.distributed.{IndexedRow, IndexedRowMatrix}
    
    val rdd = df.select(array(matrixColumns:_*).as("arr")).as[Array[Int]].rdd
      .zipWithIndex()
      .map{ case(arr, index) => IndexedRow(index, Vectors.dense(arr.map(_.toDouble)))}
    

    然后将 rdd 转换为 IndexedRowMatrix,如果需要,可以将其转换为本地矩阵:

    val dm = new IndexedRowMatrix(rdd).toBlockMatrix().toLocalMatrix()
    

    对于可以收集到驱动程序的较小的矩阵,有一个更简单的替代方案:

    val matrixColumns = df.columns.filter(_.startsWith("A")).map(col(_))
    
    val arr = df.select(array(matrixColumns:_*).as("arr")).as[Array[Int]]
      .collect()
      .flatten
      .map(_.toDouble)
    
    val rows = df.count().toInt
    val cols = matrixColumns.length
    
    // It's necessary to reverse cols and rows here and then transpose
    val dm = Matrices.dense(cols, rows, arr).transpose()
    

    【讨论】:

    • 这个答案很有帮助。但为什么是 .as[Array[Int]]?
    • @PRIYAM: 乐于助人:) .as[] 部分只是为了在转换为 rdd 或收集数据帧时更清楚。另一种方法是例如:df.rdd.map(_.getAs[Array[Int]](0)).
    猜你喜欢
    • 2018-08-05
    • 2015-07-22
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多