在 columnSimilarties() Spark scala 之后获取列名
Get Column Names after columnSimilarties() Spark scala
我正在尝试在 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 将名称附加回该向量。
我很乐意提供任何建议!!
提取列名称(这是棘手的部分,因为它无法在闭包中求值):
val names = df.columns
和map
条目:
simsPerfect.entries.map {
case MatrixEntry(i, j, v) => (names(i.toInt), names(j.toInt), v)
}
我正在尝试在 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 将名称附加回该向量。
我很乐意提供任何建议!!
提取列名称(这是棘手的部分,因为它无法在闭包中求值):
val names = df.columns
和map
条目:
simsPerfect.entries.map {
case MatrixEntry(i, j, v) => (names(i.toInt), names(j.toInt), v)
}