конвертировать spark.sql.DataFrame в Array [Array [Double]] - PullRequest
0 голосов
/ 18 февраля 2019

Я работаю в spark и, чтобы использовать класс Matrix библиотеки Jama , мне нужно преобразовать содержимое spark.sql.DataFrame в двумерный массив, т. Е. Array[Array[Double]].

Хотя я нашел довольно много решений о том, как преобразовать один столбец кадра данных в массив, я не понимаю, как

  1. преобразует весь фрейм данных в 2D-массив (то есть массив массивов);
  2. при этом переводит его содержимое из long в Double.

Причина в том, что мне нужно загрузить содержимое кадра данных в матрицу Jama, для которой в качестве входных данных требуется двумерный массив значений типа Double:

val matrix_transport = new Matrix(df_transport)

<console>:83: error: type mismatch;
 found   : org.apache.spark.sql.DataFrame
    (which expands to)  org.apache.spark.sql.Dataset[org.apache.spark.sql.Row]
 required: Array[Array[Double]]
       val matrix_transport = new Matrix(df_transport)

EDIT: для полноты схемы df:

df_transport.printSchema

root
 |-- 1_51501_19962: long (nullable = true)
 |-- 1_51501_26708: long (nullable = true)
 |-- 1_51501_36708: long (nullable = true)
 |-- 1_51501_6708: long (nullable = true)
...

с 165 столбцами идентичного типа long.

1 Ответ

0 голосов
/ 18 февраля 2019

Вот примерный код для этого.При этом я не думаю, что Spark предоставляет какие-либо гарантии порядка, в котором он возвращает строки, поэтому построение матрицы, распределенной по кластеру, может привести к проблемам.

val df = Seq(
    (10l, 11l, 12l),
    (13l, 14l, 15l),
    (16l, 17l, 18l)
).toDF("c1", "c2", "c3")

// Group columns into a single array column
val rowDF = df.select(array(df.columns.map(col):_*) as "row")

// Pull data back to driver and convert Row objects to Arrays
val mat = rowDF.collect.map(_.getSeq[Long](0).toArray)

// Do the casting
val matDouble = mat.map(_.map(_.toDouble))
...