Конвертировать spark.sql.DataFrame в Array[Array[Double]]
Я работаю в искре и, чтобы нанять Matrix
класс Jama
библиотека, мне нужно преобразовать содержимое spark.sql.DataFrame
в 2D массив, т. е. Array[Array[Double]]
,
Хотя я нашел довольно много решений о том, как преобразовать один столбец кадра данных в массив, я не понимаю, как
- преобразовать весь кадр данных в двумерный массив (то есть массив массивов);
- при этом переводя его содержимое из 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)
РЕДАКТИРОВАТЬ: для полноты, схема 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 ответ
Решение
Вот грубый код, чтобы сделать это. При этом я не думаю, что 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))