Преобразование из векторного столбца в столбец Double [Array] в Scala Spark - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть фрейм данных doubleSeq, структура которого как показано ниже

res274: org.apache.spark.sql.DataFrame = [finalFeatures: vector]

Первая запись столбца выглядит следующим образом

res281: org.apache.spark.sql.Row = [[3.0,6.0,-0.7876947819954485,-0.21757635218517163,0.9731844373162398,-0.6641741696340383,-0.6860072219935377,-0.2990737363481845,-0.7075863760365155,0.8188108975549018,-0.8468559840943759,-0.04349947247406488,-0.45236764452589984,1.0333959313820456,0.6097566070878347,-0.7106619551471779,-0.7750330808435969,-0.08097610412658443,-0.45338437108038904,-0.2952869863393396,-0.30959772365257004,0.6988768123463287,0.17049117199049213,3.2674649019757385,-0.8333373234944124,1.8462942520757128,-0.49441222531240125,-0.44187299748074166,-0.300810826687287]]

Я хочу извлечь двойной массив

[3.0,6.0,-0.7876947819954485,-0.21757635218517163,0.9731844373162398,-0.6641741696340383,-0.6860072219935377,-0.2990737363481845,-0.7075863760365155,0.8188108975549018,-0.8468559840943759,-0.04349947247406488,-0.45236764452589984,1.0333959313820456,0.6097566070878347,-0.7106619551471779,-0.7750330808435969,-0.08097610412658443,-0.45338437108038904,-0.2952869863393396,-0.30959772365257004,0.6988768123463287,0.17049117199049213,3.2674649019757385,-0.8333373234944124,1.8462942520757128,-0.49441222531240125,-0.44187299748074166,-0.300810826687287]

из этого -

doubleSeq.head(1)(0)(0)

дает

Any = [3.0,6.0,-0.7876947819954485,-0.21757635218517163,0.9731844373162398,-0.6641741696340383,-0.6860072219935377,-0.2990737363481845,-0.7075863760365155,0.8188108975549018,-0.8468559840943759,-0.04349947247406488,-0.45236764452589984,1.0333959313820456,0.6097566070878347,-0.7106619551471779,-0.7750330808435969,-0.08097610412658443,-0.45338437108038904,-0.2952869863393396,-0.30959772365257004,0.6988768123463287,0.17049117199049213,3.2674649019757385,-0.8333373234944124,1.8462942520757128,-0.49441222531240125,-0.44187299748074166,-0.300810826687287]

Что не решает мою проблему

Scala Spark - столбец с разделенными векторамив отдельные столбцы в Spark DataFrame

Не решает мою проблему, но это индикатор

1 Ответ

2 голосов
/ 08 апреля 2019

Итак, вы хотите извлечь вектор из строки и превратить его в массив двойных чисел.

Проблема с вашим кодом заключается в том, что метод get (и используемый вами неявный метод apply) возвращает объект типа Any. Действительно, Row - это общий непараметризованный объект, и во время компиляции невозможно определить, какие типы он содержит. Это немного похоже на списки в Java 1.4 и раньше. Чтобы решить эту проблему в искре, вы можете использовать метод getAs, который можно параметризировать с помощью выбранного вами типа.

В вашей ситуации у вас, кажется, есть кадр данных, содержащий вектор (org.apache.spark.ml.linalg.Vector).

import org.apache.spark.ml.linalg._
val firstRow = df.head(1)(0) // or simply df.head
val vect : Vector = firstRow.getAs[Vector](0)
// or all in one: df.head.getAs[Vector](0)

// to transform into a regular array
val array : Array[Double] = vect.toArray

Обратите внимание, что вы можете получить доступ к столбцам по имени, например так:

val vect : Vector = firstRow.getAs[Vector]("finalFeatures")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...