计算余弦相似度Spark数据帧

Mou*_*oud 11 scala apache-spark apache-spark-sql apache-spark-mllib

我使用Spark Scala来计算Dataframe行之间的余弦相似度.

数据帧格式如下

root
    |-- SKU: double (nullable = true)
    |-- Features: vector (nullable = true)
Run Code Online (Sandbox Code Playgroud)

以下数据框的示例

    +-------+--------------------+
    |    SKU|            Features|
    +-------+--------------------+
    | 9970.0|[4.7143,0.0,5.785...|
    |19676.0|[5.5,0.0,6.4286,4...|
    | 3296.0|[4.7143,1.4286,6....|
    |13658.0|[6.2857,0.7143,4....|
    |    1.0|[4.2308,0.7692,5....|
    |  513.0|[3.0,0.0,4.9091,5...|
    | 3753.0|[5.9231,0.0,4.846...|
    |14967.0|[4.5833,0.8333,5....|
    | 2803.0|[4.2308,0.0,4.846...|
    |11879.0|[3.1429,0.0,4.5,4...|
    +-------+--------------------+
Run Code Online (Sandbox Code Playgroud)

我试图转置矩阵并检查以下提到的链接.Apache Spark Python Cosine与DataFrames 的相似性,计算 - 余弦相似性 - 通过-text-into-vector-using-tf-idf但我相信有一个更好的解决方案

我尝试了下面的示例代码

val irm = new IndexedRowMatrix(inClusters.rdd.map {
  case (v,i:Vector) => IndexedRow(v, i)


}).toCoordinateMatrix.transpose.toRowMatrix.columnSimilarities
Run Code Online (Sandbox Code Playgroud)

但我得到了以下错误

Error:(80, 12) constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: org.apache.spark.sql.Row
      case (v,i:Vector) => IndexedRow(v, i)
Run Code Online (Sandbox Code Playgroud)

我检查了以下链接Apache Spark:如何从DataFrame创建矩阵?但是不能使用Scala来做到这一点

hi-*_*zir 7

  • DataFrame.rddRDD[Row]不 返回RDD[(T, U)]。您必须进行图案匹配Row或直接提取有趣的部分。
  • ml Vector与用于Datasets自火花2.0是不一样的mllib Vector由旧的API使用。您必须将其转换为可与结合使用IndexedRowMatrix
  • 索引必须Long不是字符串。
import org.apache.spark.sql.Row

val irm = new IndexedRowMatrix(inClusters.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) })
Run Code Online (Sandbox Code Playgroud)

  • 我更新了我的问题的答案,但是有什么方法可以使用Dataframes端对端地做到这一点? (3认同)