Dataframe 如何将spark数据帧转换为带索引的矩阵?

Dataframe 如何将spark数据帧转换为带索引的矩阵?,dataframe,apache-spark,matrix,pyspark,apache-spark-sql,Dataframe,Apache Spark,Matrix,Pyspark,Apache Spark Sql,我有一个spark数据帧df,如下所示: C1toC1 C1toC2 C1toC3 C2toC1 C2toC2 C2toC3 C3toC1 C3toC2 C3toC3 2 0 6 7 32 3 3 0 10 2 10 23 6 32 4 3 10 34 3 10 23 6 35 12 6

我有一个spark数据帧df,如下所示:

C1toC1 C1toC2 C1toC3 C2toC1 C2toC2 C2toC3 C3toC1 C3toC2 C3toC3
2      0      6      7      32     3      3      0      10
2      10     23     6      32     4      3      10     34
3      10     23     6      35     12     6      76     34
2      13     25     2      41     4      4      10     32
   C1 C2 C3       C1 C2 C3      C1 C2 C3       C1 C2 C3
C1 2  0  6     C1 2  10 23   C1 3  10 23    C1 2  13 25
C2 7  32 3     C2 6  32 4    C2 6  35 12    C2 2  41 4 
C3 3  0  10 ,  C3 3  10 34,  C3 6  76 34 ,  C3 4  10 32
如何将其转换为如下所示的4个矩阵:

C1toC1 C1toC2 C1toC3 C2toC1 C2toC2 C2toC3 C3toC1 C3toC2 C3toC3
2      0      6      7      32     3      3      0      10
2      10     23     6      32     4      3      10     34
3      10     23     6      35     12     6      76     34
2      13     25     2      41     4      4      10     32
   C1 C2 C3       C1 C2 C3      C1 C2 C3       C1 C2 C3
C1 2  0  6     C1 2  10 23   C1 3  10 23    C1 2  13 25
C2 7  32 3     C2 6  32 4    C2 6  35 12    C2 2  41 4 
C3 3  0  10 ,  C3 3  10 34,  C3 6  76 34 ,  C3 4  10 32
然后哪个可以写入csv文件


谢谢大家!

不确定您希望CSV输出是什么样子,但这将使您离您想要的更近一步。我想每个id都将对应一个csv文件,但我将等待您确认

import pyspark.sql.functions as F

df2 = df.withColumn(
    'id',
    F.monotonically_increasing_id()
).select(
    'id',
    F.posexplode_outer(
        F.array(
            F.array(df.columns[:3]),
            F.array(df.columns[3:6]),
            F.array(df.columns[6:])
       )
    )
).selectExpr(
    'id',
    "concat('C', pos+1) name",
    'col[0] C1',
    'col[1] C2',
    'col[2] C3')

df2.show()
+---+----+---+---+---+
| id|name| C1| C2| C3|
+---+----+---+---+---+
|  0|  C1|  2|  0|  6|
|  0|  C2|  7| 32|  3|
|  0|  C3|  3|  0| 10|
|  1|  C1|  2| 10| 23|
|  1|  C2|  6| 32|  4|
|  1|  C3|  3| 10| 34|
|  2|  C1|  3| 10| 23|
|  2|  C2|  6| 35| 12|
|  2|  C3|  6| 76| 34|
|  3|  C1|  2| 13| 25|
|  3|  C2|  2| 41|  4|
|  3|  C3|  4| 10| 32|
+---+----+---+---+---+

您可以使用“collect”将行放入一个列表中,对于该列表中每个元素的矩阵,您可以只对该元素的每3个对象进行切片。