如何将 DataFrame 转换为密集向量数组?

Posted

技术标签:

【中文标题】如何将 DataFrame 转换为密集向量数组?【英文标题】:How to convert a DataFrame to an Array of dense vectors? 【发布时间】:2022-01-21 10:03:57 【问题描述】:

我将如何转换以下 DataFrame

val df = Seq(
  (5.0, 1.0, 1.0, 3.0, 7.0),
  (2.0, 0.0, 3.0, 4.0, 5.0),
  (4.0, 0.0, 0.0, 6.0, 7.0)).toDF("m1", "m2", "m3", "m4", "m5")
//df: res166: org.apache.spark.sql.DataFrame = [m1: int, m2: int ... 3 more fields]

到密集向量数组

val arrayDenseVectors = Array(
      Vectors.dense(5.0, 1.0, 1.0, 3.0, 7.0),
      Vectors.dense(2.0, 0.0, 3.0, 4.0, 5.0),
      Vectors.dense(4.0, 0.0, 0.0, 6.0, 7.0))
//arrayDenseVectors: Array[org.apache.spark.mllib.linalg.Vector] = Array([5.0,1.0,1.0,3.0,7.0], [2.0,0.0,3.0,4.0,5.0], [4.0,0.0,0.0,6.0,7.0])

为了使问题进一步复杂化,df 列的类型为 Int 而不是 Double

【问题讨论】:

【参考方案1】:

在RDD上使用map,你可以将每一行转换成Vector,然后收集到一个数组中:

import org.apache.spark.mllib.linalg.Vectors

val arrayDenseVectors = df.rdd.map  r =>
  Vectors.dense(Array((0 to 3).map(r.getAs[Double](_)): _*))
.collect

//arrayDenseVectors: Array[org.apache.spark.ml.linalg.Vector] = Array([5.0,1.0,1.0,3.0], [2.0,0.0,3.0,4.0], [4.0,0.0,0.0,6.0])

【讨论】:

以上是关于如何将 DataFrame 转换为密集向量数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 3-D Numpy 数组转换为 Pandas Dataframe?

将特征的 Spark 向量转换为数组

如何将块压缩行转换为密集矩阵?

如何将 Scikit Learn OneVsRestClassifier 预测方法输出转换为谷歌云 ML 的密集数组?

R语言unlist函数将复杂数据(list列表dataframe字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称)

将 DataFrame 中的字符串数组拆分为它们自己的列