Pandas 如何在pyspark dataframe中对单个列执行整形操作?

Pandas 如何在pyspark dataframe中对单个列执行整形操作?,pandas,numpy,apache-spark,pyspark,apache-spark-sql,Pandas,Numpy,Apache Spark,Pyspark,Apache Spark Sql,我有一个很长的pyspark数据帧,如下所示: +------+ |number| +------+ |12.4 | |13.4 | |42.3 | |33.4 | |42.3 | |32.4 | |44.2 | |12.3 | |45.4 | +------+ 理想情况下,我希望将其重塑为nxn矩阵,其中n是sqrt(pyspark数据帧的长度) 虽然有一个解决方案,将其转换为一个numpy数组,然后将其重塑为nxn矩阵,但我希望在pyspark中完成。因为我的数据非常长(

我有一个很长的pyspark数据帧,如下所示:

+------+
|number|
+------+
|12.4  |
|13.4  |
|42.3  |
|33.4  |
|42.3  |
|32.4  |
|44.2  |
|12.3  |
|45.4  |
+------+
理想情况下,我希望将其重塑为
nxn
矩阵,其中
n
sqrt(pyspark数据帧的长度)

虽然有一个解决方案,将其转换为一个numpy数组,然后将其重塑为
nxn
矩阵,但我希望在pyspark中完成。因为我的数据非常长(大约1亿行)

因此,我希望得到的预期产出大致如下:

+------+------+------+
|12.4  | 13.4 | 42.3 |
|33.4  | 42.3 | 32.4 |
|44.2  | 12.3 | 45.4 |
+------+------+------+

虽然我能够通过将其转换为pandas,然后转换为numpy,然后再执行重塑操作来正确地完成它。但我想在Pyspark本身中进行这种转换。因为下面的代码只适用于几千行

covarianceMatrix_pd = covarianceMatrix_df.toPandas()
nrows = np.sqrt(len(covarianceMatrix_pd))
covarianceMatrix_pd = covarianceMatrix_pd.to_numpy().reshape((int(nrows),int(nrows)))
covarianceMatrix_pd

一种方法是在对数据帧进行计数后,使用带有pivot的
行数

from pyspark.sql import functions as F, Window
from math import sqrt



我不知道出于某种原因,它能够成功地以期望的方式进行转换。但顺序不正确。我的数据是双重类型,也有负值。我用一个4行长的df进行交叉检查,df的值为-[-0.002323,0.002232,0.003323,-0.0014]。我从您的代码片段中得到的输出如下-[[0.002232,-0.0014],-0.002323,0.003323]]。这并没有达到预期的效果。你能盘问一下@anky吗?我想这是因为长数据帧中的负值。我检查了你说的新代码。顺序仍然不同。此外,我还通过运行这个->
df.withColumn(“Rnum”)和((Rnum-1)/c.cast(“Integer”).show()进行了交叉检查。通过执行此操作,顺序也会发生变化(假设我在df中有负值)@VishalAnand顺序可能会发生变化,但是Rnum分配是否正确?如果是,那么这应该是可行的。我在一个社区版本中测试了你的例子,它成功了。如果我必须按照这个顺序得到问题的结果会怎么样。[[12.4, 33.4 , 44.2 ], [13.4  ,42.3 , 12.3], [42.3, 32.4, 45.4]]. 为了实现@andy?@Vishalana,应该在代码中做哪些更改,并尝试使用类似于
df.withColumn(“Rnum”,(Rnum-1)%c)的Rnum
c = int(sqrt(df.count())) #this gives 3
rnum = F.row_number().over(Window.orderBy(F.lit(1)))

out = (df.withColumn("Rnum",((rnum-1)/c).cast("Integer"))
 .withColumn("idx",F.row_number().over(Window.partitionBy("Rnum").orderBy("Rnum")))
.groupby("Rnum").pivot("idx").agg(F.first("number")))
out.show()

+----+----+----+----+
|Rnum|   1|   2|   3|
+----+----+----+----+
|   0|12.4|13.4|42.3|
|   1|33.4|42.3|32.4|
|   2|44.2|12.3|45.4|
+----+----+----+----+