arrays - 将 spark.sql.DataFrame 转换为 Array[Array[Double]]
问题描述
我在 spark 中工作,为了使用libraryMatrix
的类,我需要将 a 的内容转换为2D 数组,即.Jama
spark.sql.DataFrame
Array[Array[Double]]
虽然我找到了很多关于如何将数据帧的单列转换为数组的解决方案,但我不明白如何
- 将整个数据帧转换为二维数组(即数组数组);
- 这样做时,将其内容从 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
。
解决方案
这是执行此操作的粗略代码。话虽如此,我不认为 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))
推荐阅读
- php - PDO bindParam 不起作用
- scala - Scala SBT 不能使用第三方库
- java - java Runtime.getRuntime().exec 使用 cat 和管道
- json - 如何使用已收到的授权令牌发布请求?
- java - AbstractScheduledService 取消 runOneIteration
- c# - RestSharp 请求的错误消息
- java - 如何删除/不显示空值?
- c# - Form.Controls.OfType 的奇怪行为
- for-loop - Liquid - if contains 语句在 for 循环中不起作用
- php - 如果未选中,则将复选框值设为零