当前位置: 首页 > 知识库问答 >
问题:

转换spark.sql.数据帧为数组[数组[双]]

闻人仲渊
2023-03-14

我在火花中工作,要使用Jama库的Matrix类,我需要将spark.sql.DataFrame的内容转换为2D数组,即Array[Array[Douple]]

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

  1. 将整个数据帧转换为2D数组(即数组数组);
  2. 这样做时,将其内容从长转换为双倍。

原因是我需要将数据帧的内容加载到Jama矩阵中,这需要一个2D的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列相同类型的


共有1个答案

有玄天
2023-03-14

下面是大致的代码。尽管如此,我认为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))
 类似资料:
  • 我有这个数据框 我想转换这种形式的Numpy数组: 我正在使用转换为_矩阵函数,并在它重塑(1,4)后使用,但它不起作用!!它给我的格式是:有什么建议吗?我需要把它转换成那种格式,这样我就可以应用“精确回忆曲线”功能。

  • 我有一个pandas数据框架,其中混合了数据类型(DType),我希望将其转换为numpy结构化数组(或记录数组,在本例中基本相同)。对于纯数字数据帧,使用方法很容易做到这一点。我还需要将pandas列的数据类型转换为字符串而不是对象,以便使用numpy方法,该方法将数字和字符串输出到二进制文件,但不会输出对象。 简而言之,我需要将带有的panda列转换为字符串或unicode数据类型的numpy

  • 数据帧: 我遵循了一个类似问题的解决方案:如何从for循环中构建和填充熊猫数据帧? 您可以看到这些值都是准确的,但是它返回了每个索引的整个值列表 此输出看起来正确,但正如您所看到的,只返回第一组

  • 我有一个数据框,在完成分组后得到,如下所示:- 我想将其转换为:-

  • 如何将pandas数据帧(21 x 31)转换为numpy数组? 例如: 数组_1(n_1,n_2,n_3,…,n31) 数组_2(n_1,n_2,n_3,…,n31) 数组21(n_1,n_2,n_3,…,n31) 我尝试了以下代码段: .. 并得到如下结果: 问题是第二个方括号太多了。我该如何解决这个问题?

  • 我从excel中读取了如下数据: 我想把列'10V'和'11V'成两个数组。以便用滤波系数处理数据。但是我不知道如何将列复制到数组,或者如何直接访问/操作DataFrame中的元素? 谁能给我一个提示吗?非常感谢。