복붙노트

[SCALA] 계산 코사인 유사성 스파크 Dataframe

SCALA

계산 코사인 유사성 스파크 Dataframe

나는 Dataframe 행 사이의 코사인 유사도를 계산하는 불꽃 스칼라를 사용하고 있습니다.

Dataframe 형식은 아래에

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

아래 dataframe의 샘플

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

내가 DataFrames을 통해 파이썬 코사인 유사성 행렬을 전치 다음과 같은 언급 links.Apache 스파크를 확인하려고 계산 코사인 유사성별로 featurizing을-(가) - 텍스트로 - 벡터-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)

나는 다음과 같은 링크 아파치 불꽃을 확인 : 어떻게 DataFrame에서 매트릭스를 만드는 방법? 하지만 스칼라를 사용 할 수 없습니다

해결법

  1. ==============================

    1.

    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) })
    
  2. from https://stackoverflow.com/questions/47010126/calculate-cosine-similarity-spark-dataframe by cc-by-sa and MIT license