[英]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.