Dataframe 如何将spark数据帧转换为带索引的矩阵?
我有一个spark数据帧df,如下所示: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
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个对象进行切片。