web-dev-qa-db-ja.com

コサイン類似度の計算Sparkデータフレーム

Spark Scalaを使用して、データフレーム行間のコサイン類似度を計算しています。

データフレームフォーマットは以下の通りです

root
    |-- SKU: double (nullable = true)
    |-- Features: vector (nullable = true)

以下のデータフレームのサンプル

    +-------+--------------------+
    |    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...|
    +-------+--------------------+

行列を転置して、次のリンクを確認しようとしました。 Apache Spark Python DataFramesでのコサイン類似度計算-余弦-類似性-テキストをベクトル化-使用-tf-idf しかし、私はより良い解決策があると信じています

以下のサンプルコードを試してみました

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


}).toCoordinateMatrix.transpose.toRowMatrix.columnSimilarities

しかし、私は以下のエラーが発生しました

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)

次のリンクを確認しました Apache Spark:DataFrameからマトリックスを作成する方法は? しかし、Scalaを使用してそれを行うことはできません

11
  • _DataFrame.rdd_はRDD[(T, U)]ではなく_RDD[Row]_を返します。 Rowにパターンマッチングするか、興味深い部分を直接抽出する必要があります。
  • mlVectorDatasetsとともに使用されます。Spark 2.0はmllibVectorと同じではないため古い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) })
_
7
hi-zir