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

时间:2019-02-18 16:49:42

标签: arrays apache-spark jama

我正在研究火花,要使用PATH libraryMatrix类,我需要将Jama的内容转换为2D数组,即spark.sql.DataFrame

虽然我找到了很多关于如何将数据框的单个列转换为数组的solutions,但我不知道如何

  1. 整个数据框转换为2D数组(即数组的数组);
  2. 这样做时,将其内容从long转换为Double。

原因是我需要将数据帧的内容加载到Jama矩阵中,该矩阵需要二维Doubles数组作为输入:

Array[Array[Double]]

编辑: 为了完整起见,df模式为:

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)

具有165个相同类型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) ... 的列。

1 个答案:

答案 0 :(得分: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))