【问题标题】:Get Column Names after columnSimilarties() Spark scala在 columnSimilarties() Spark scala 之后获取列名
【发布时间】:2023-03-29 20:59:01
【问题描述】:

我正在尝试使用 spark 中的 columnSimilarities() 构建基于项目的协同过滤模型。使用 columnsSimilarities() 后,我想将原始列名分配回 Spark scala 中的结果。

用于计算数据框上的 columnSimilarities() 的可运行代码。

数据

// 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) 

计算该数据框上的 columnSimilarities():

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

我的想法是将名称与该向量中的位置相匹配,其顺序应相同,但我不知道如何将名称与 cosineSimilarities 重新附加到该向量中。

我很高兴得到任何建议!

【问题讨论】:

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


    【解决方案1】:

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

    val names = df.columns
    

    map 条目:

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

    【讨论】:

      猜你喜欢
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-04-25
      • 1970-01-01
      • 2018-03-18
      • 2016-06-06
      • 2022-01-08
      • 2020-04-14
      相关资源
      最近更新 更多