我有一个如下所示的PySpark数据框:
id header1 header2 header3 ... headerN
a 997 154.5 0.8 ....
b 0.3 3.4 6.7 ....
c 7 8 9 ....
.
.
.
我想将其转换为看起来像这样的平面表:
a header1 997
a header2 154.5
a header3 0.8
b header1 0.3
b header2 0.3
等
每个标题列名称都是唯一的。第一列名称是ID。如何在PySpark中最有效地转换它?我可以遍历DataFrame,但是必须有一种更有效的方法。
这是一个示例数据框:
df = spark.createDataFrame([
('a',997.0,154.5,0.8),
('b',0.3,3.4,6.7),
('c',7.0,8.0,9.0)],
['id','header1','header2','header3'])
答案 0 :(得分:1)
一种方法-
第一步:使用create_map函数将collect
列(除id之外的列)插入map
列;
第二步:explode
地图列;
from pyspark.sql.functions import create_map, lit, explode, col
map_cols = (c for x in df.columns if x != 'id' for c in [lit(x), col(x)])
df.select('id', explode(create_map(*map_cols))).show()
+---+-------+-----+
| id| key|value|
+---+-------+-----+
| a|header1|997.0|
| a|header2|154.5|
| a|header3| 0.8|
| b|header1| 0.3|
| b|header2| 3.4|
| b|header3| 6.7|
| c|header1| 7.0|
| c|header2| 8.0|
| c|header3| 9.0|
+---+-------+-----+