Arrays 将spark.sql.DataFrame转换为Array[Array[Double]]
我在spark中工作,为了使用Jama的Matrix类,我需要将spark.sql.DataFrame的内容转换为2D数组,即array[array[Double]] 虽然我已经找到了很多关于如何将数据帧的单个列转换为数组的方法,但我不知道如何 将整个数据帧转换为2D数组,即数组数组; 在这样做的同时,将其内容从长到双。 原因是我需要将数据帧的内容加载到Jama矩阵中,该矩阵需要一个二维双精度数组作为输入:Arrays 将spark.sql.DataFrame转换为Array[Array[Double]],arrays,apache-spark,jama,Arrays,Apache Spark,Jama,我在spark中工作,为了使用Jama的Matrix类,我需要将spark.sql.DataFrame的内容转换为2D数组,即array[array[Double]] 虽然我已经找到了很多关于如何将数据帧的单个列转换为数组的方法,但我不知道如何 将整个数据帧转换为2D数组,即数组数组; 在这样做的同时,将其内容从长到双。 原因是我需要将数据帧的内容加载到Jama矩阵中,该矩阵需要一个二维双精度数组作为输入: val matrix_transport = new Matrix(df_transpo
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列的相同类型。以下是执行此操作的大致代码。话虽如此,我认为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))
数据帧的模式是什么?通常,您需要转换行,然后收集它们,因为Jama希望您的数据都在驱动程序节点上,这可能会导致问题,具体取决于矩阵的大小。所有列的类型都是long nullable=true。大小应该没问题,这是165x165平方的矩阵。谢谢!事实上,合并不会保持行顺序。我通过添加一个id列,然后按照如下方式对数组排序:df=df.withColumnid,monoticallyincrengingid[follow instructions in solution]val matDouble\u sorted=matDouble.sortBy\u num\u cols
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))