将 spark.sql.DataFrame 转换为 Array[Array[Double]]
convert spark.sql.DataFrame to Array[Array[Double]]
我在 spark 工作,要使用 Jama
library 的 Matrix
class,我需要转换 [=15] 的内容=] 到二维数组,即 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
。
这是粗略的代码。也就是说,我不认为 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))
我在 spark 工作,要使用 Jama
library 的 Matrix
class,我需要转换 [=15] 的内容=] 到二维数组,即 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
。
这是粗略的代码。也就是说,我不认为 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))