首页 > 解决方案 > 将 spark.sql.DataFrame 转换为 Array[Array[Double]]

问题描述

我在 spark 中工作,为了使用libraryMatrix的类,我需要将 a 的内容转换为2D 数组,即.Jama spark.sql.DataFrameArray[Array[Double]]

虽然我找到了很多关于如何将数据帧的单列转换为数组的解决方案,但我不明白如何

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

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

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

标签: arraysapache-sparkjama

解决方案


这是执行此操作的粗略代码。话虽如此,我不认为 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))

推荐阅读