在PySpark中将2D矩阵-数据框转换为平面表

时间:2018-10-25 00:05:41

标签: python apache-spark dataframe pyspark apache-spark-sql

我有一个如下所示的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'])

1 个答案:

答案 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|
+---+-------+-----+