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を使用してそれを行うことはできません
DataFrame.rdd
_はRDD[(T, U)]
ではなく_RDD[Row]
_を返します。 Row
にパターンマッチングするか、興味深い部分を直接抽出する必要があります。ml
Vector
はDatasets
とともに使用されます。Spark 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) })
_