Преобразование org.apache.spark.mllib.linalg.Matrix для запуска фрейма данных в Scala - PullRequest
0 голосов
/ 26 июня 2018

У меня есть входной фрейм данных input_df как:

+---------------+--------------------+
|Main_CustomerID|              Vector|
+---------------+--------------------+
|         725153|[3.0,2.0,6.0,0.0,9.0|
|         873008|[4.0,1.0,0.0,1.0,...|
|         625109|[1.0,0.0,6.0,1.0,...|
|         817171|[0.0,4.0,0.0,7.0,...|
|         611498|[1.0,0.0,4.0,5.0,...|
+---------------+--------------------+

input_df имеет тип схемы,

root
 |-- Main_CustomerID: integer (nullable = true)
 |-- Vector: vector (nullable = true)

Ссылаясь на Рассчитать кадр данных искры косинусного сходства , я создал индексированную матрицу строк, а затем сделал:

val lm = irm.toIndexedRowMatrix.toBlockMatrix.toLocalMatrix 

чтобы найти косинусное сходство между столбцами. Теперь у меня есть результирующая матрица mllib,

cosineSimilarity: org.apache.spark.mllib.linalg.Matrix =
0.0  0.4199605255658081  0.5744269579035528  0.22075539284417395  0.561434614044346
0.0  0.0                 0.2791452631195413  0.7259079527665503   0.6206918387272496
0.0  0.0                 0.0                 0.31792539222893695  0.6997167152675132
0.0  0.0                 0.0                 0.0                  0.6776404124278828
0.0  0.0                 0.0                 0.0                  0.0

Теперь мне нужно преобразовать этот lm типа org.apache.spark.mllib.linalg.Matrix в кадр данных. Я ожидаю, что мой вывод dataframe будет выглядеть следующим образом:

+---+------------------+------------------+-------------------+------------------+
| _1|                _2|                _3|                 _4|                _5|
+---+------------------+------------------+-------------------+------------------+
|0.0|0.4199605255658081|0.5744269579035528|0.22075539284417395| 0.561434614044346|
|0.0|               0.0|0.2791452631195413| 0.7259079527665503|0.6206918387272496|
|0.0|               0.0|               0.0|0.31792539222893695|0.6997167152675132|
|0.0|               0.0|               0.0|                0.0|0.6776404124278828|
|0.0|               0.0|               0.0|                0.0|               0.0|
+---+------------------+------------------+-------------------+------------------+

Как я могу сделать это в Scala?

1 Ответ

0 голосов
/ 27 июня 2018

Чтобы преобразовать Matrix в кадр данных, как указано, выполните следующие действия. Сначала он преобразует матрицу в кадр данных, содержащий один столбец с массивом. Затем foldLeft используется для разбиения массива на отдельные столбцы.

import spark.implicits._
val cols = (0 until lm.numCols).toSeq

val df = lm.transpose
  .colIter.toSeq
  .map(_.toArray)
  .toDF("arr")

val df2 = cols.foldLeft(df)((df, i) => df.withColumn("_" + (i+1), $"arr"(i)))
  .drop("arr")
...