Получить имена столбцов после columnSimilarties () Spark scala

Я пытаюсь создать модель совместной фильтрации на основе элементов с помощью columnSimilarities () в Spark. После использования columnsSimilarities () я хочу вернуть исходные имена столбцов результатам в Spark scala.

Запускаемый код для вычисления columnSimilarities () во фрейме данных.

Данные

// rdd
val rowsRdd: RDD[Row] = sc.parallelize(
  Seq(
    Row(2.0, 7.0, 1.0),
    Row(3.5, 2.5, 0.0),
    Row(7.0, 5.9, 0.0)
  )
)

// Schema  
val schema = new StructType()
  .add(StructField("item_1", DoubleType, true))
  .add(StructField("item_2", DoubleType, true))
  .add(StructField("item_3", DoubleType, true))

// Data frame  
val df = spark.createDataFrame(rowsRdd, schema) 

Вычислить columnSimilarities () для этого фрейма данных:

import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.mllib.linalg.distributed.{MatrixEntry, CoordinateMatrix, RowMatrix}

val rows = new VectorAssembler().setInputCols(df.columns).setOutputCol("vs")
  .transform(df)
  .select("vs")
  .rdd

val items_mllib_vector = rows.map(_.getAs[org.apache.spark.ml.linalg.Vector](0))
                             .map(org.apache.spark.mllib.linalg.Vectors.fromML)
val mat = new RowMatrix(items_mllib_vector)
val simsPerfect = mat.columnSimilarities()


simsPerfect.entries.collect.mkString(", ")

Вывод:

res0: String = MatrixEntry(0,2,0.24759378423606918), MatrixEntry(1,2,0.7376189553526812), MatrixEntry(0,1,0.8355316482961213)

Мне нужно получить исходные имена из столбцов вместо позиции в этом векторе.

Я попытался прочитать имена столбцов из df с помощью:

val names = df.columns

и моя идея заключалась в том, чтобы сопоставить имена с позициями в этом векторе, которые должны быть в том же порядке, но я не знаю, как прикрепить имена обратно в этот вектор с помощью cosineSimilarities.

Рад любому совету !!


person Duesentrieb    schedule 05.03.2017    source источник


Ответы (1)


Извлеките имена столбцов (это сложная часть здесь, потому что она не может быть оценена в закрытии):

val names = df.columns

и map записи:

simsPerfect.entries.map {
  case MatrixEntry(i, j, v)  => (names(i.toInt),  names(j.toInt), v)
}
person zero323    schedule 05.03.2017