在columnSimilarties()Spark Scala之后获取列名



我正在尝试使用Spark中的columnSimaririties()构建基于项目的协作过滤模型。使用"列"()之后,我想将原始列名称分配给Spark Scala中的结果。

可运行的代码来计算数据框架上的columnSimilities()。

数据

// rdd
val rowsRdd: RDD[Row] = sc.parallelize(
  Seq(
    Row(2.0, 7.0, 1.0),
    Row(3.5, 2.5, 0.0),
    Row(7.0, 5.9, 0.0)
  )
)
// Schema  
val schema = new StructType()
  .add(StructField("item_1", DoubleType, true))
  .add(StructField("item_2", DoubleType, true))
  .add(StructField("item_3", DoubleType, true))
// Data frame  
val df = spark.createDataFrame(rowsRdd, schema) 

在该数据框架上计算columnSimurilities():

import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.mllib.linalg.distributed.{MatrixEntry, CoordinateMatrix, RowMatrix}
val rows = new VectorAssembler().setInputCols(df.columns).setOutputCol("vs")
  .transform(df)
  .select("vs")
  .rdd
val items_mllib_vector = rows.map(_.getAs[org.apache.spark.ml.linalg.Vector](0))
                             .map(org.apache.spark.mllib.linalg.Vectors.fromML)
val mat = new RowMatrix(items_mllib_vector)
val simsPerfect = mat.columnSimilarities()

simsPerfect.entries.collect.mkString(", ")

输出:

res0: String = MatrixEntry(0,2,0.24759378423606918), MatrixEntry(1,2,0.7376189553526812), MatrixEntry(0,1,0.8355316482961213)

我已经从列中获取原始名称,而不是该向量中的位置。

我尝试读取DF中的列名:

val names = df.columns

我的想法是将名称与该矢量的位置匹配,但我不知道如何将名称与偶然性相连。

我很高兴任何建议!

提取列名称(这是此处的棘手部分,因为无法在闭合中进行评估):

val names = df.columns

map条目:

simsPerfect.entries.map {
  case MatrixEntry(i, j, v)  => (names(i.toInt),  names(j.toInt), v)
}

相关内容

  • 没有找到相关文章

最新更新