将 spark.sql.DataFrame 转换为 Array[Array[Double]]

convert spark.sql.DataFrame to Array[Array[Double]]

我在 spark 工作,要使用 Jama libraryMatrix class,我需要转换 [=15] 的内容=] 到二维数组,即 Array[Array[Double]].

虽然我发现了很多 关于如何将数据帧的单个列转换为数组的方法,但我不明白如何

  1. 整个数据帧转换为二维数组(即数组的数组);
  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)

编辑: 为了完整起见,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

这是粗略的代码。也就是说,我不认为 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))