【发布时间】:2019-12-23 02:17:39
【问题描述】:
scala (pyspark guy) 的新手并尝试计算行(项目)之间的余弦相似度
以创建示例 df 为例:
Spark, Scala, DataFrame: create feature vectors
import org.apache.spark.ml.feature.VectorAssembler
val df = sc.parallelize(Seq(
(1, "cat1", 1), (1, "cat2", 3), (1, "cat9", 5), (2, "cat4", 6),
(2, "cat9", 2), (2, "cat10", 1), (3, "cat1", 5), (3, "cat7", 16),
(3, "cat8", 2))).toDF("userID", "category", "frequency")
// Create a sorted array of categories
val categories = df
.select($"category")
.distinct.map(_.getString(0))
.collect
.sorted
// Prepare vector assemble
val assembler = new VectorAssembler()
.setInputCols(categories)
.setOutputCol("features")
// Aggregation expressions
val exprs = categories.map(
c => sum(when($"category" === c, $"frequency").otherwise(lit(0))).alias(c))
val transformed = assembler.transform(
df.groupBy($"userID").agg(exprs.head, exprs.tail: _*))
.select($"userID", $"features")
transformed.show
+------+--------------------+
|userID| features|
+------+--------------------+
| 1|(7,[0,2,6],[1.0,3...|
| 3|(7,[0,4,5],[5.0,1...|
| 2|(7,[1,3,6],[1.0,6...|
+------+--------------------+
尝试按照这篇文章将 df 转换为 IndexedRowMatrix 并在如何正确映射 rdd 时遇到 scala 语法问题
Calculate Cosine Similarity Spark Dataframe
import org.apache.spark.sql.Row
val irm = new IndexedRowMatrix(transformed.rdd.map {
Row(_, v: org.apache.spark.ml.linalg.Vector) =>
org.apache.spark.mllib.linalg.Vectors.fromML(v)
}.zipWithIndex.map { case (v, i) => IndexedRow(i, v) })
<console>:5: error: not a legal formal parameter.
Note: Tuples cannot be directly destructured in method or function parameters.
Either create a single parameter accepting the Tuple1,
or consider a pattern matching anonymous function: `{ case (param1, param1) => ... }
Row(_, v: org.apache.spark.ml.linalg.Vector) =>
^
谢谢!
【问题讨论】:
标签: scala apache-spark