繁体   English   中英

Spark-scala:将 dataframe 转换为 mllib 矩阵

[英]Spark-scala: Converting dataframe to mllib Matrix

我正在尝试转置一个巨大的 dataframe (100Mx20K)。 由于 dataframe 分布在多个节点上并且难以在驱动程序上收集,我想通过mllib矩阵的转换来进行转置。 这个想法似乎已经在别处进行了测试,所以选择的过程如下:

import org.apache.spark.sql.functions._
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.distributed.{IndexedRow, IndexedRowMatrix}

val sqlContext = new org.apache.spark.sql.SQLContext(sc)

val df = sqlContext.read.parquet("temp/test.parquet").select("H1","H2","H3","H4")
val matrixColumns = df.columns

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

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

我注意到一种可能的类型并尝试替换:

orig:
    val rdd = df.select(array(matrixColumns:_*).as("arr"))....

modified:
    val rdd = df.select(Array(matrixColumns:_*)).as("arr")...

但是,两者都不适合我,并且上述更改会引发错误:

scala> df.select(Array(matrixColumns:_*)).as("arr")
              ^
       error: overloaded method select with alternatives:
         [U1](c1: org.apache.spark.sql.TypedColumn[org.apache.spark.sql.Row,U1]): org.apache.spark.sql.Dataset[U1] <and>
         (col: String,cols: String*)org.apache.spark.sql.DataFrame <and>
         (cols: org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame
        cannot be applied to (Array[String])

我不确定是否存在版本问题(我使用的是 Spark 3.3.0)或者问题是否出在其他地方。 对于修复上述错误的任何帮助,我将不胜感激。

将 select 调用更改为:

df.select(matrixColumns.head, matrixColumns: _*)

或者

import org.apache.spark.sql.functions.col

df.select(matrixColumns.map(col(_)):_*)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM